二叉树转换

时间:2014-11-11 01:11:07

标签: algorithm data-structures tree transformation

        1                                 5 
    /       \                             |
   2         3            -->             2
 /  \       / \                         /   \
4    5     6   7                       1     4
                                       |
                                       3
                                     /   \
                                    6     7

假设您有一个左侧的二叉树,并尝试将其转换为右侧的树。

它的作用是颠覆二叉树的“任何”单叶节点 - 这种情况为'5' - 这使得叶节点成为新的根节点。原始根节点(和它的子节点) - 这种情况'1'及其子节点 - 占用当时的叶节点空间。

这是什么通用算法?

感谢您的帮助。

2 个答案:

答案 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))