正如标题所暗示的,如果我们在二进制搜索树(BST)中有节点x并且我们知道 x.successor 而不是 x.parent 的信息,我们也知道x.left和x.right。如何根据以上信息计算x.parent。
我决定在两种情况下分析它:( root有高度为0)
对于第一种情况,我们可以使用以下伪代码。
y = x.succ
if x.right == NIL
z = y.left
while x != z
y = z;
z = z.right
return z
如何处理第二种情况?如果x.right != NIL
会发生什么?
15
6 18
3 7 17 19
2 4 13 20
9
如何检索节点18和19的父节点,因为最右边的节点20没有后继节点,所以它将返回NIL。
答案 0 :(得分:1)
我们无法始终根据您的信息获取父级。 例如,2个节点,nodeOne.right = x 我们只知道x left = null,right = null,successor = null 我们无法检索nodeOne
当x不在最右边的分支时,我们可以得到父(这意味着它有一些祖先的左分支包含x)。
算法可以是:
继续寻找合适的儿子,正确的孙子......,直到没有 然后得到继任者,并进入你的代码(你的代码有点错误?)
function getParent(Node node){
Node right = node;
for(;right.right != null; right = right.right){
}
Node successor = right.successor;
if (successor == null)
return null;
if (successor.left == node)
return successor;
for(Node p = successor.left; p!= null; p=p.right){
if (p.right == node){
return p;
}
}
return null;
}