알고리즘 문제 - 두 갈래 나무 결점의 중차적 역행 후계 결점
9426 단어 두 갈래 나무
생각:
아버지를 가리키는 결점이 있다면:
시간 복잡도는 트리의 높이 O(lgN)입니다.
코드:
1 //
2 struct TreeNode 3 { 4 int value; 5 TreeNode *parent; 6 TreeNode *left; 7 TreeNode *right; 8 }; 9
10 TreeNode *inorderSuccessor(TreeNode *node) 11 { 12 if(node == NULL) 13 return NULL; 14
15 TreeNode *successor = NULL; 16
17 if(node->right != NULL || node->parent == NULL) // , ,
18 { 19 successor = node->right; 20 while(successor != NULL && successor->left != NULL) // ,
21 { 22 successor = successor->left; 23 } 24 } 25 else
26 { 27 while( (successor = node->parent) != NULL ) 28 { 29 if(successor->left == node) // ,
30 { 31 break; 32 } 33 node = successor; //
34 } 35 } 36
37 return successor; 38 }
만약 아버지의 결점을 가리키는 지침이 없다면 반드시 뿌리 노드를 정해야 한다.중간 순서로 두 갈래 나무를 훑어보고 창고로 비귀속 훑어보기;cur_로pop는 현재 창고의 결점을 가리키고prev는 이전 창고의 결점을 가리킨다.prev_pop이 결점을 입력할 때cur_pop은 바로 구하는 후계 결점이다.시간 복잡도는 O(N)입니다.
코드:
1 //
2 struct TreeNode 3 { 4 int value; 5 TreeNode *left; 6 TreeNode *right; 7 }; 8
9 TreeNode *inorderSuccessor(TreeNode *root, TreeNode *node) // , ,
10 { 11 if(root == NULL || node == NULL) 12 return NULL; 13
14 stack<TreeNode *> tns; 15 tns.push(root); 16
17 TreeNode *prev_pop, *cur_pop = NULL; //prev_pop ,cur_pop
18 TreeNode *ptn = root->left; //ptn,
19
20 while( !tns.empty() || ptn != NULL ) 21 { 22 if(ptn != NULL) // ,
23 { 24 tns.push(ptn); 25 ptn = ptn->left; 26 } 27 else
28 { 29 prev_pop = cur_pop; 30 cur_pop = tns.top(); 31 tns.pop(); //
32
33 if(prev_pop == node) 34 break; 35
36 ptn = cur_pop->right; //
37 } 38 } 39
40 if(prev_pop == node) //
41 return cur_pop; 42 else
43 return NULL; 44 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 데이터 구조 2차원 트리의 실현 코드일.두 갈래 트리 인터페이스 2 노드 클래스 3. 두 갈래 나무 구현 이 글을 통해 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.