【题目】
给定一棵二叉树的头结点head,完成二叉树的先序、中序和后序遍历。如果二叉树的节点数为N,要求时间复杂度为O(N),额外控件复杂度为O(1).
【代码】
//morris中序遍历二叉树
public static void morrisIn(Node head){
if(head==null){
return;
}
Node cur1=head;
Node cur2=null;
while(cur1!=null){
cur2=cur1.left;
if(cur2!=null){//找到当前节点左子树的最右节点
if(cur2.right!=null && cur2.right!=cur1){
cur2=cur2.right;
}
if(cur2.right==null){//最右节点右指针为空,则将其指向当前节点
cur2.right=cur1;
cur1=cur1.left;//当前节点置为其左孩子
continue;
}
else{//最右节点右指针不为空,恢复为null,到下一步输出打印
cur2=null;
}
}
System.out.print(cur1.value+" ");//若当前节点左节点为空,直接输出当前节点
cur1=cur1.right;//右移,置为当前节点的右节点
}
}
//morris先序遍历二叉树
public static void morrisPre(Node head){
if(head==null){
return;
}
Node cur1=head;
Node cur2=null;
while(cur1!=null){
cur2=cur1.left;//中间节点左孩子
if(cur2!=null){
while(cur2.right!=null && cur2.right!=cur1.right){
cur2=cur2.right;
}
if(cur2.right==null){
cur2.right=cur1;//子树最右节点指向中间节点
System.out.print(cur1);//打印中间节点
cur1=cur1.left;
continue;
}else{//恢复
cur2.right=null;
}
}
else{//中间节点无左孩子,打印中间节点,再看右孩子情况
System.out.print(cur1.value);
}
cur1=cur1.right;
}
}
2452

被折叠的 条评论
为什么被折叠?



