이진 탐색 트리에 노드가 있다고 가정하고 BST에서 해당 노드의 순차 계승자를 찾아야 합니다. 순서대로 계승자가 없으면 null을 반환합니다. 노드의 후임자는 노드의 값보다 큰 키가 가장 작은 노드라는 것을 알고 있기 때문입니다.
노드에는 직접 액세스할 수 있지만 트리 루트에는 액세스할 수 없습니다. 여기서 각 노드는 상위 노드에 대한 참조를 갖습니다. 아래는 Node −
에 대한 정의입니다.class Node {
public int val;
public Node left;
public Node right;
public Node parent;
} 입력이 다음과 같은 경우 -

노드가 2이면 출력은 3이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
노드의 오른쪽이 null이 아니면 -
-
노드 :=노드의 오른쪽
-
노드의 왼쪽이 null이 아닌 동안 수행 -
-
노드 :=노드의 왼쪽
-
-
반환 노드
-
-
동안 (노드의 부모가 null이 아니고 노드가 노드의 부모의 왼쪽과 같지 않음) -
-
노드 :=노드의 부모
-
-
반환 노드의 부모
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int val;
Node* left;
Node* right;
Node* parent;
Node(int v, Node* par = NULL){
val = v;
left = NULL;
right = NULL;
parent = par;
}
};
class Solution {
public:
Node* inorderSuccessor(Node* node) {
if (node->right) {
node = node->right;
while (node->left)
node = node->left;
return node;
}
while (node->parent && node != node->parent->left) {
node = node->parent;
}
return node->parent;
}
};
main(){
Solution ob;
Node *root = new Node(5);
root->left = new Node(3, root);
root->right = new Node(6, root);
root->left->left = new Node(2, root->left);
root->left->right = new Node(4, root->left);
root->left->left->left = new Node(1, root->left->left);
cout << (ob.inorderSuccessor(root->left->left))->val;
} 입력
Node *root = new Node(5); root->left = new Node(3, root); root->right = new Node(6, root); root->left->left = new Node(2, root->left); root->left->right = new Node(4, root->left); root->left->left->left = new Node(1, root->left->left); (ob.inorderSuccessor(root->left->left))->val
출력
3