我找到了Morris树遍历的实现,
它工作正常,但尝试有点问题 以相反的顺序遍历树.. -
void MorrisTraversal(struct Node *root)
{
struct Node *p,*pre;
if(root==0) { return; }
for(p=root;p!=0;)
{
if(p->Left==0) { printf(" %d ",p->Data); p=p->Right; continue; }
for(pre=p->Left;pre->Right!=0 && pre->Right!=p;pre=pre->Right) { }
if(pre->Right==0)
{ pre->Right=p; p=p->Left; continue; }
else
{ pre->Right=0; printf(" %d ",p->Data); p=p->Right; continue; }
}
}
答案 0 :(得分:2)
按照相反的顺序,我假设你的意思是反向顺序遍历。您至少有两个选择:
您可以修改代码并将所有->Right
指针引用交换为->Left
个。
您可以将两个printf
语句替换为堆栈。算法完成后,您将弹出堆栈中的数据以打印它们。然而,这无法实现Morris遍历算法的整个目的,即无堆叠算法。
此相关SO thread可能有助于您理解。
我希望这会有所帮助。
答案 1 :(得分:1)
以下是Java中的一个示例。 Click Here再使用迭代而不是递归的另一个样本。
public int depthOfTree(TreeNode node){
if(node == null){
return 0;
}
int leftDepth = depthOfTree(node.left);
int rightDepth = depthOfTree(node.right);
if(leftDepth > rightDepth){
return leftDepth+1;
} else {
return rightDepth+1;
}
}
//Reverse Level with recursion
public void reverseLevelOrder(TreeNode node){
int depth = depthOfTree(node);
for(int i=depth;i>0;i--){
printTree(node,i);
}
}
public void printTree(TreeNode node, int level){
if(node == null){
return;
}
if(level == 1){
System.out.print(node.data+" ,");
} else if(level>1){
printTree(node.left, level-1);
printTree(node.right, level-1);
}
}