JS二叉树非递归遍历
二叉树的递归遍历很简单就可以实现,二叉树非递归遍历却想不出来?那你可以看看下面的例子。
一个二叉树的例子
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
相关推荐
steeven 2020-11-10
Tips 2020-10-14
nongfusanquan0 2020-08-18
yedaoxiaodi 2020-07-26
清溪算法君老号 2020-06-27
pengkingli 2020-06-25
yishujixiaoxiao 2020-06-25
清溪算法 2020-06-21
RememberMePlease 2020-06-17
nurvnurv 2020-06-05
SystemArchitect 2020-06-02
码墨 2020-05-29
清溪算法 2020-05-27
choupiaoyi 2020-05-27
清溪算法 2020-05-25
bluewelkin 2020-05-19
dbhllnr 2020-05-15
steeven 2020-05-09
baike 2020-05-09