WindChaser 2019-06-21
二叉树的递归遍历很简单就可以实现,二叉树非递归遍历却想不出来?那你可以看看下面的例子。
var root = {
val: 1,
left: {
val: 2, left: { val: 4, }, right:{ val:5 }
},
right: {
val: 3, left: { val: 6 }, right: { val: 7 }
}
}
先实现三种遍历的递归算法以作比较。
function DLR(root){
if(root!=null){ console.log(root.val); DLR(root.left); DLR(root.right); }
}
DLR(root)//1,2,4,5,3,6,7
function LDR(root){
if(root!=null){ LDR(root.left);//先遍历到最左边的节点,然后输出 console.log(root.val); LDR(root.right); }
}
LDR(root)//4,2,5,1,6,3,7
function LRD(root){
if(node!=null){ LRD(root.left); LRD(root.right); console.log(root.val); }
}
LRD(root)//4,5,2,6,7,3,1
看完上面的递归遍历,下面对比一下非递归的二叉树遍历。你会发现递归真心简单。
function DLR(root){
var arr=[],res=[]; if(root!=null){ arr.push(root); } while(arr.length!=0){ var temp=arr.pop(); res.push(temp.val); //这里先放右边再放左边是因为取出来的顺序相反 if(temp.right!=null){ arr.push(temp.right); } if(temp.left!=null){ arr.push(temp.left); } } return res;
}
DLR(root)//1,2,4,5,3,6,7
//先把左边的,全部放进arr再输出,处理右边的。
function LDR(root){
var arr=[],res=[]; while(true){ while(root!=null){ arr.push(root); root=root.left; } //终止条件:最后树遍历完了自然就结束 if(arr.length==0){ break; } var temp=arr.pop(); res.push(temp.val); root=temp.right; } return res;
}
LDR(root)//4,2,5,1,6,3,7
function LRD(root){
var arr=[],res=[]; arr.push(root); while(arr.length!=0){ var p=arr.pop(); res.push(p.val); if(p.left!=null){ arr.push(p.left); } if(p.right!=null){ arr.push(p.right); } } return res.reverse();
}
LRD(root)//4,5,2,6,7,3,1