如何在二叉树中查找节点的父节点?

时间:2014-10-16 19:12:12

标签: java tree

我有一棵树从一般树转换为二叉树:

                   B
                  /
                 A
                  \
                   D
                  / \
                 /   I
                /   /
               C    H
                \    \
                 E    L
                  \
                   G 
                  /
                 F

表示以下内容:

  • B是根,其子女是A,D,I
  • D的孩子是C,E,G
  • 我的孩子是H,L

等等。

现在,我必须编写以下方法:

public Position<E> parent(Position<E> v)

其中“v”表示上述树中的一个字母,此方法需要找到其父级。

我几个小时都在苦苦挣扎......有什么想法吗?

4 个答案:

答案 0 :(得分:1)

来自你所展示的内容:

算法是:

start from root

for every node v

every left-child is node v's child so add this child to node v childs list

every right-child is node v's parent's child(or parent of parent until it is a left-child of its parent, then the node you discovered is the child of left-child node's parent's child).

用于在实际树中查找节点父节点的伪代码:

enter node.

if node is left child
    print its node->parent.
else
    while node->parent is right child
       node = node->parent
    print node->parent.

答案 1 :(得分:1)

我和你做同样的功课......

对于解决方案, 我们的常规树中的父节点将是我们的二叉树中的一个节点,该节点具有一个左子节点,并且该父节点的右子节点不等于我们的节点v。(参见节点I)

您可以对此进行处理:如果v的父级为左子级,则v的父级将是具有左子级的最后找到的节点。但是父级必须没有正确的子级,所以如果它有一个,则必须搜索最后一个节点的上级父级。(参见节点I)

希望这有帮助

答案 2 :(得分:0)

这很简单;假设您的Node类无法访问父级,即

class Node{
Node left;
Node right;
int value;
}

您需要做的就是从根开始并以pre-order方式遍历树。如果您遇到目标节点,那么它的父节点是从Stack中弹出的最后两个元素之一(为什么?)

@See Depth First Search

答案 3 :(得分:0)

在这种二叉树中,最简单的方法是将子指针重新标记为children(左子)和sibling(右子),因为这就是它们所代表的含义。由于您没有父指针,因此当您找到可能是父节点的节点时,必须在搜索未来节点时将其传递。

我需要做很多假设,因为你提供的信息很少。

如果Position是您的节点类型,并且您所需的函数是Tree的成员,那么它将类似于:

private Position<E> parentImpl(Position<E> v, Position<E> node, Position<E> parent) {

  if (node.equals(v)) {
    return parent;
  } 

  for (Position<E> child = v.children; child != null; child = child.sibling) {
    Position<E> rtn = parentImpl(v, child, node);  // current node is parent
    if (rtn != null) {
      return rtn;
    }
  }        
  return null;
}

现在你想要的功能只是调用它。

public Position<E> parent(Position<E> v) {
  return parentImpl(v, root, null);  // Root has no parent.
}

当v根本不在树中并且它是树的根时,这将返回null。