我试图找到BST节点的顺序继承者。以下是我的示例代码。
public TreeNode getInorderSuccesor(TreeNode t)
{
if(t == null)
{
return null;
}
if(t.getRight()!=null)
{
t = t.getRight();
while(t.getLeft()!=null)
{
t = t.getLeft();
}
return t;
}
else
{
TreeNode parent = t.getParent();
while(parent!=null && parent.getLeft() != t)
{
t = parent;
parent = t.getParent();
}
return parent;
}
}
如果有任何条件失败,请告诉我。还有一件事,如果有人可以共享algo / code / sudocode来找到没有父节点的inorder后继者。感谢!!!
答案 0 :(得分:0)
这是后继功能的基本逻辑;前一功能类似,但相反。递归函数下降树搜索所请求的密钥,每次跟随左子树时,跟踪当前树作为可能的后继者。如果找到密钥,则其后继元素是右子树的最小元素,通过追踪左子树直到到达空节点为止。如果搜索到达空节点并因此无法找到密钥,则树中的下一个最大密钥是后继,在每个递归调用中保存的可能后继中找到。我最近在my blog实现了这个算法。
答案 1 :(得分:0)
如果树中的节点具有唯一值,那么它非常简单。你只需要找到:
后一个节点将是答案。第一个节点可用于检查输入节点是否是树中的有效节点。
的伪代码:
function inOrderSuccessor(val, tree):
(left, right) = findRange(val, tree.rootnode, null, null)
if (left.val != val):
throw Error("No node with specified value")
return right
function findRange(val, currnode, left, right):
if (currnode == null):
return (left, right)
if (currnode.val <= val):
return findRange(val, currNode.right, currnode, right)
else:
return findRange(val, currNode.right, left, currnode)
如果树中的节点可能具有重复值,则有序后继节点定义不明确。有必要知道何时给定节点,如何区分具有相同值的不同节点。您是否真的参考了树中的节点?
在一个棘手的情况下,你只是给一个节点的引用,并且树中有其他节点具有相同的值,那么有两种情况: