[英]Inorder Successor of Binary tree
我正在学习如何在二进制搜索树中找到有序后继者,我知道:
如果节点的右子树不为NULL,则后继者位于右子树中。 请遵循。
转到右侧子树,并在右侧子树中返回键值最小的节点。
如果节点的右子树为NULL,则后继者是祖先之一。 请遵循。
使用父指针向上移动,直到看到其父节点的左子节点。 这样的节点的父节点是后继节点。
我不明白为什么为什么如果正确的子树不为null,我们必须返回最小值的节点,如果正确的子树为null,我们必须找到其父级的左子节点。 这样的节点的父节点是后继节点。
请帮助。这是该算法的关键。
struct node * inOrderSuccessor(struct node *root, struct node *n)
{
// step 1 of the above algorithm
if( n->right != NULL )
return minValue(n->right);
// step 2 of the above algorithm
struct node *p = n->parent;
while(p != NULL && n == p->right)
{
n = p;
p = p->parent;
}
return p;
}
考虑以下树:4 2 6 1 3 5
首先考虑获取“ 3”的后继者,因为右孩子为空,所以您必须将树上移到第一个祖先的父亲,即其祖先的左孩子。 请记住,在二叉搜索树中,每个左子节点将小于当前节点,而每个右子节点将大于当前节点。 按照这种逻辑,任何左孩子的父母都将大于该孩子。
现在考虑获取“ 4”的后继者,首先您要转到“ 6”,但是由于它有一个左子节点,因此该左后裔树中的任何节点都将在4到6之间,即紧邻的右子节点的最左子节点将直接成为该节点的后继者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.