Q: Write an algorithm to find the ‘next’ node (i.e., in-order successor) of a given node in a binary search tree where each node has a link to its parent.
A: 中序遍历的后继节点。 即找到最小的大于当前节点值的节点。
如果当前节点存在右孩子,那么结果就是当前节点右子树的最左节点。
如果当前节点没有右孩子,就向上寻找,node = node->parent, 一直到 node->parent == NULL 或者 node == node->parent->left,则node->parent就是结果
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
TreeNode () {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *p, node[maxn];
int cnt;
void init(){
p = NULL;
memset(node, '\0', sizeof(node));
cnt = 0;
}
void create_minimal_tree(TreeNode* &head, TreeNode *parent, int a[], int start, int end){
if(start <= end){
int mid = (start + end)>>1;
node[cnt].val = a[mid];
node[cnt].parent = parent;
head = &node[cnt++];
create_minimal_tree(head->left, head, a, start, mid-1);
create_minimal_tree(head->right, head, a, mid+1, end);
}
}
TreeNode *nextNode (TreeNode *node) {
if (node->right) {
TreeNode *cur = node->right;
while (cur->left) {
cur = cur->left;
}
return cur;
} else {
TreeNode *p = node->parent;
while (p && node == p->right) {
node = p;
p = p->parent;
}
return p;
}
}
int main(){
int a[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
};
init();
TreeNode *head = NULL;
create_minimal_tree(head, NULL, a, 0, 9);
cout<<"the head is "<<head->val<<endl;
cout<<"the successor of head is: "<<(nextNode(head))->val<<endl;
return 0;
}