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