在二进制搜索树中查找有序继承者

时间:2014-04-25 20:58:01

标签: java algorithm binary-tree binary-search-tree

我正在创建二进制搜索树类我让我的所有功能都工作,接受后继者。

我的树输入是  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; 
    }

4 个答案:

答案 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)

可能的算法如下:

  1. 如果您有一个非空的右子树,则后继是该子树中的最小值
  2. 否则,除非你不再是你父母的合适孩子,或者直到你到达根,否则走上树。
  3. 如果你现在在根,你没有继任者。否则,再走一步,你就是继任者
  4. 示例:

    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;