【问题标题】:Recursive inorder Successor of a given element in BST with java使用java的BST中给定元素的递归中序继任者
【发布时间】:2014-12-14 12:17:40
【问题描述】:

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

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);
}

【问题讨论】:

  • 您能否指定您的问题并在原始问题中发布相关代码?
  • 对不起,我编辑了我的帖子,所以现在应该更具体了。

标签: java recursion binary-search-tree inorder


【解决方案1】:

给定节点的中序后继是该节点右子树中的最低节点。否则,将在树的简单顺序遍历中打印下一个节点。

  1. 如果节点有右子节点,则此解决方案简化为在右子树中查找最小节点。
  2. 如果节点没有右子节点,并且没有父指针,我们需要从树的根开始,按照我们的方式确定这个后继节点。

这是解决此问题的递归方法。调用该方法时,将 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;
}

【讨论】:

  • 但关键是我不应该只使用父节点从根开始并使用递归找到该元素的后继
  • 程序所做的正是 - 它只使用根节点。它不假定使用父指针。通过程序的过程,我们识别出一个节点并将其称为父节点。这与使用父指针非常不同。事实上,让我重命名所有内容以阻止混乱。
  • Tyvm 的解释我现在明白了。
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2023-03-19
相关资源
最近更新 更多