我有一棵树从一般树转换为二叉树:
B
/
A
\
D
/ \
/ I
/ /
C H
\ \
E L
\
G
/
F
表示以下内容:
等等。
现在,我必须编写以下方法:
public Position<E> parent(Position<E> v)
其中“v”表示上述树中的一个字母,此方法需要找到其父级。
我几个小时都在苦苦挣扎......有什么想法吗?
答案 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。