我正在创建二进制搜索树类我让我的所有功能都工作,接受后继者。
我的树输入是 30 10 45 38 20 50 25 33 8 12
当我打印Inorder遍历时,它会显示为
8 10 12 20 25 30 33 38 45 50
当我输入值8时,它表示其后继为12.输入10和12本身相同。
当我输入值33时,它表示继承者为50.其中没有。
我似乎无法修复它。任何建议的帮助将不胜感激。
我在主要方面称呼它:
BinarySearchTree BST = new BinarySearchTree(array);
BST.getSeccessor(a); // where a is user input to find it successor
以下是我的代码......
public TreeNode Successor(TreeNode node) {
if (node == null)
return node;
if (node.right != null) {
return leftMostNode(node.right);
}
TreeNode y = node.parent;
while (null != y && (y.right).equals(node)) {
node = y;
y = y.parent;
}
return y;
}
public static TreeNode leftMostNode(TreeNode node) {
if (null == node) { return null; }
while (null != node.left) {
node = node.left;
}
return node;
}
/** Search value in Tree need for Successor **/
public TreeNode Search(int key) {
TreeNode node = root;
while (node != null) {
if (key < node.value) {
node = node.left;
} else if (key > node.value) {
node = node.right;
}
return node;
}
return null;
}
/** Returns Successor of given value **/
public int getSuccessor(int val) {
TreeNode node = Successor(Search(val));
return node.value;
}
答案 0 :(得分:3)
顺序接班人将是
if (node.hasRight())
node = node.getRight();
else {
while (node.isRightChild())
node = node.getParent();
return node.getParent();
}
while (node.hasLeft())
node = node.getLeft();
return node;
也可以在那里放一些空检查。
答案 1 :(得分:3)
可能的算法如下:
示例:
if node.right != null
return leftmostInSubtree(node.right)
while node != root && node.parent.right == node
node = node.parent
if node == root
return null
return node.parent
答案 2 :(得分:3)
我在 Niklas 回答中添加了基于伪代码的工作解决方案:
public TreeNode successor(TreeNode node) {
if (node == null)
return node;
if (node.right != null) {
return leftMostNode(node.right);
}
while (null != node.parent /*while we are not root*/
&& node.parent.right == node) /* and while we are "right" node */ {
node = node.parent; // go one level up
}
return node.parent;
}
要使其正常工作,您必须修复某些方法的实现(在下面提供):
/** Search value in Tree need for Successor **/
public TreeNode search(int key) {
TreeNode node = root;
while (node != null
&& key != node.value) {
if(key < node.value) {
node = node.left;
} else if (key > node.value) {
node = node.right;
}
}
return node;
}
/** Returns Successor of given value **/
public int getSuccessor(int val) {
TreeNode node;
if (null == (node = search(val))
|| (null == (node = successor(node))) {
// either val is not in BST, or it is the last value-> no successor
return ERROR_CODE; // -1, for instance;
}
return node.value;
}
答案 3 :(得分:0)
我认为上面的代码不适用于最右边的最后一个节点。 这是改进版本:
if(node.right!=null)
{
node=node.right;
while(node.left!=null)
node=node.left;
}`
else if(node.parent==root)
return null;
else if(node==node.parent.left)
node=node.parent;
else
{
while(node.parent!=null)
node=node.parent
}
return node;