1 5
/ \ |
2 3 --> 2
/ \ / \ / \
4 5 6 7 1 4
|
3
/ \
6 7
假设您有一个左侧的二叉树,并尝试将其转换为右侧的树。
它的作用是颠覆二叉树的“任何”单叶节点 - 这种情况为'5' - 这使得叶节点成为新的根节点。原始根节点(和它的子节点) - 这种情况'1'及其子节点 - 占用当时的叶节点空间。
这是什么通用算法?
感谢您的帮助。
答案 0 :(得分:1)
这在很大程度上取决于支持二叉树的结构(例如,如果您存储或不存储每个节点的父节点,等等)。假设您存储节点的值以及左右后代(最基本的信息),问题将减少为“反转”从当前根向下到将成为新根的节点的所有弧。我想,在Java风格的伪代码中,有类似的东西:
void rev(Node u, Node v) {
// make v point back to u
if (v.left == null) v.left = u;
else v.right = u;
// free edge from u to link up
if (u.left == v) u.left = null;
else u.right = null;
}
boolean reroot(Node root, Node parent, Node newRoot) { // assumes that newRoot is a leaf
if (root != null)
if (root == newRoot) {
rev(root, parent);
return true;
} else {
if (reroot(root.left, root) || reroot(root.right, root)) {
rev(root, parent);
return true;
}
}
}
return false;
}
尽管如此,我没有测试上面的代码。
编辑:初始调用将被重新调用(currentRoot,null,newRoot);
答案 1 :(得分:1)
我的想法:从节点开始,我们将其父节点和另一个未探索的分支添加到新树作为新分支,然后我们通过迭代回原始树直到其根来递归构建新树。
python样式伪代码将是这样的:
NewTree=Node
NoLongerChildNode=NULL
while (Node!=root):
NewTree.attach(Node.anotherchild(NoLongerChildNode))
NewTree=NewTree.attach(Node.parent)
NoLongerChildNode=Node
Node=Node.parent
NewTree.attach(Node.anotherchild(NoLongerChildNode))