Tree Traversal没有递归,没有堆栈,也没有更改树

时间:2014-08-20 11:17:40

标签: algorithm tree binary-tree

这个问题来自“算法导论3:

**二叉树中的每个节点都有4个属性:key,left,right,parent

编辑:二叉树存储为链接节点,每个节点都有我提到的4个属性。

写一个O(n)时间非递归过程,给定一个n节点二叉树, 打印出每个节点的密钥。在树本身之外使用不超过恒定的额外空间,并且在此过程中不要修改树,即使是暂时的。

我试图找到一个解决方案,但什么都没有......(我也搜索谷歌搜索本书的解决方案,但这个问题没有包含在那里,可能是因为它是在以后的版本中添加的)。

1 个答案:

答案 0 :(得分:4)

这是一个解决方案:

  • current存储当前访问的节点(初始化为树的根目录)
  • origin表示我们如何到达当前节点。它是FROM_PARENTFROM_LEFT_CHILDFROM_RIGHT_CHILD中的一个。 (初始化为FROM_PARENT

算法:

  • 如果我们来自顶部,我们打印钥匙并向左下方
  • 如果我们从左边回来,请向右走
  • 如果我们以正确的方式回来,请上去。

origin = FROM_PARENT;
current = root;

while (current != null) {

    switch (origin) {

    case FROM_PARENT:
        System.out.println(current.key);
        if (current.left != null)
            goLeft();
        else
            origin = FROM_LEFT_CHILD;
        break;

    case FROM_LEFT_CHILD:
        if (current.right != null)
            goRight();
        else
            origin = FROM_RIGHT_CHILD;
        break;

    case FROM_RIGHT_CHILD:
        goToParent();
        break;
    }            
}

其中

static void goToParent() {
    if (current.parent == null) {
        current = null;
        return;
    }
    origin = current == current.parent.left ? FROM_LEFT_CHILD
                                            : FROM_RIGHT_CHILD;
    current = current.parent;
}

static void goLeft() {
    origin = FROM_PARENT;
    current = current.left;
}

static void goRight() {
    origin = FROM_PARENT;
    current = current.right;
}