inorder successor 就是中序遍歷的下一個節點,既是左孩子得父親,
ret變量記錄root的父親結點,當while循環結束時,如果原本的root = None或者p不存在與BST中(那么此刻root = None),都返回None
找到p之后,如果p沒有右兒子,則第一個比它大的數字就是剛剛記錄的ret
找到p之后,如果有右兒子,則找到右子樹中的最左邊的值(最小值)
struct TreeNode * inorderSuccessor(struct TreeNode *root,struct TreeNode* p)
{
if (root == NULL || p == NULL) {
return NULL;
}
struct TreeNode *ret = NULL;
while (root && root->val != p->val) {
if (p->val < root->val) {
ret = root;
root = root->left;
}
else {
root = root->right;
}
}
if(root == NULL) //not found
return NULL;
if(root->right == NULL)
return ret;
root = root.right //找出右邊最小值就是中序下一個點
while(root->left!=NULL)
root = root->left;
return root;
}