这个问题来自“算法导论3:
”**二叉树中的每个节点都有4个属性:key,left,right,parent
编辑:二叉树存储为链接节点,每个节点都有我提到的4个属性。
写一个O(n)时间非递归过程,给定一个n节点二叉树, 打印出每个节点的密钥。在树本身之外使用不超过恒定的额外空间,并且在此过程中不要修改树,即使是暂时的。
我试图找到一个解决方案,但什么都没有......(我也搜索谷歌搜索本书的解决方案,但这个问题没有包含在那里,可能是因为它是在以后的版本中添加的)。
答案 0 :(得分:4)
这是一个解决方案:
current
存储当前访问的节点(初始化为树的根目录)origin
表示我们如何到达当前节点。它是FROM_PARENT
,FROM_LEFT_CHILD
,FROM_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;
}