递归inorder使用java在BST中给定元素的继承者

时间:2014-12-14 12:17:40

标签: java recursion binary-search-tree inorder

由于代码太长,链接就在这里 - > http://pastebin.com/jXgbE6bB 因为我不太擅长递归,所以我找不到适合这个问题的递归函数。
(PSI我是这个论坛的新手,我知道我会有很多讨厌的评论,比如为什么不去寻找关于递归和其他事情的教程,但相信我,我已经做了一切,但我只是不能理解逻辑递归)
我的问题是二进制搜索树中给定元素的有序后继的递归函数是什么?我做了这么远,但它只返回它应该的节点的父节点印刷:

public E getSuccessor(BNode<E> t, E x) {
    if(t.left!=null && x.equals(t.info)){
        return t.left.info;
    }
    else if(x.compareTo(t.info)<0){
        return (getSuccessor(t.left, x));
    }
    else {
        return (getSuccessor(t.right, x));
    }
}

public E getSuccessor(E x) {
    return getSuccessor(root, x);
}

1 个答案:

答案 0 :(得分:2)

给定节点的inorder后继节点是该节点的右子树中的最低节点。为了另外理解,它是下一个节点,它将以简单的顺序遍历树的方式打印。

  1. 如果节点有一个正确的子节点,则此解决方案简化为在右子树中查找最小节点。
  2. 如果节点没有正确的子节点,并且没有父指针,我们需要从树的根开始并按照我们的方式识别此后继节点。
  3. 这是解决此问题的递归方法。在调用方法时,将root作为树的根,传递的继承者的节点需要为t,null作为后继者,因为该方法将计算它。类似于以下内容 -

    BinaryTreeNode successor = tree.inorderSuccessor(root,node,null);

    public BinaryTreeNode<Type> inorderSuccessor(BinaryTreeNode<Type> root,BinaryTreeNode<Type> t,BinaryTreeNode<Type> successor)
    {
        if(root==null)
            return null;
        if(root.element==t.element)
        {
            if(root.right!=null)
                return findMin(root.right);
            else
                return successor;
        }
        int cmp=t.element.compareTo(root.element);
    
        if(cmp < 0)
            return inorderSuccessor(root.left,t,root);
        else
            return inorderSuccessor(root.right,t,successor);
    }
    
    public BinaryTreeNode<Type> findMin(BinaryTreeNode<Type> t)
    {
        if(t==null)
            return t;
        while(t.left!=null)
            t=t.left;
        return t;
    }