Java-在二叉树中查找节点的父节点?(从常规树转换而来)

Java-在二叉树中查找节点的父节点?(从常规树转换而来),java,traversal,Java,Traversal,我有一个从普通树转换而来的二叉树。 也就是说,任何给定节点的左节点都是该节点的子节点,而任何给定节点的右节点都是该节点的同级节点 我的问题是-我如何编写一个方法来获取一个节点并找到它的父节点?我想是穿过整棵树 谢谢 让我看看我是否理解正确 这取决于树的实现。通常树没有任何循环,每个节点都有一个子节点的引用。但同样,这就是树的实现方式 如果您正在查找leaf,则可以继续递归到节点的子节点,直到它达到child等于null的基本情况 findLeaves (Node n) { if (n ==

我有一个从普通树转换而来的二叉树。 也就是说,任何给定节点的左节点都是该节点的子节点,而任何给定节点的右节点都是该节点的同级节点

我的问题是-我如何编写一个方法来获取一个节点并找到它的父节点?我想是穿过整棵树


谢谢

让我看看我是否理解正确

这取决于树的实现。通常树没有任何循环,每个节点都有一个子节点的引用。但同样,这就是树的实现方式

如果您正在查找leaf,则可以继续递归到节点的子节点,直到它达到child等于null的基本情况

findLeaves (Node n) {
  if (n == null)
    return;
  else if (n.left == null AND n.right == null)
    return n; // A child
  else
    findLeaves(n.left);
    findLeaves(n.right);

}
根也是这样。如果节点引用了父节点,并且我们正在查找根节点。继续递归到父节点,直到父节点为null,这意味着该节点是父节点

findRoot (Node n) {
  if (n == null)
    return;
  else if (n.parent == null)
    return n; // A root
  else
    findRoot(n.parent);

}
我希望这对你有帮助

private static BinaryNode getParent(AnyType x, BinaryNode<AnyType> t, BinaryNode<AnyType> parent) {
        if (t == null) {
            return null;
        } else {
            if (x.compareTo(t.element) < 0) {
                return getParent(x, t.left, t);
            } else if (x.compareTo(t.element) > 0) {
                return getParent(x, t.right, t);
            } else {
                return parent;
            }
        }
    }

如果您有一个包含“value”整型变量的节点类。sudo代码可以这样编写

Node find_parent(Node currentNode, Node parentNode, int valueOfChildNode) {
     Node finalNode = null;
     if ( currentNode->value == valueOfChildNode ) return parentNode;
     if ( currentNode->left_child) 
          finalNode = find_parent(currentNode->left_child,valueOfChildNode,currentNode);
     if ( !finalNode && currentNode->right_child )
          find_parent(currentNode->right_child,valueOfChildNode,currentNode);
     return finalNode;
}
您可以根据您的要求进行更改。您可以按照下面给出的示例来调用它


查找父二叉树->根节点,空,15

这是一个非常普遍的问题。您是否有一些可能使用的节点示例代码?只需将节点想象为一个对象,并且node.hasleet和node.haslright是唯一使用的方法,它们都可以是true或false。如果一个节点有一个左节点,则表示该节点是其子节点。如果它有一个正确的节点,就意味着它是它的兄弟节点。如果没有这些,那么它就是一个外部节点。在遍历包含当前节点路径的树时,最好创建一个列表。这样,您就可以在节省大量计算时间的同时节省少量内存。您可以使用一个带有lookabead的发布解决方案,这意味着在每次调用中,您只需检查当前节点的子节点是否是所需的子节点并返回当前节点。我想我必须使用Euler Tour来查找给定节点的父节点节点,看起来Euler Tour在您发布的代码中被使用,但我真的不理解它。。顺便说一句,我的方法只接收1个节点,而不是像你这样的3个参数,并返回其父节点。谢谢你的帮助!但我不是在找孩子或根,我是在找父母。。那我该怎么做呢?谢谢!但这是我的方法:public Position parentPosition v,其中v是您必须查找并返回其父节点的节点,那么我将如何相应地修改您的代码?好的。上面的版本是递归的。您必须以迭代的方式进行,在这种方式中,您将显式地使用堆栈。Java有许多数据结构,您可以在这个链接中使用,或者如果您仍然希望递归地使用这些结构,并且只传递一个参数,那么您必须在类中引入一个节点父节点数据变量,以便每个子节点都知道其父节点是谁,这样您就可以像@lookman的第二个答案一样返回它