二叉樹的遞歸遍歷很簡單就能夠實現,二叉樹非遞歸遍歷卻想不出來?那你能夠看看下面的例子。node
var root = {
val: 1,
left: {算法
val: 2, left: { val: 4, }, right:{ val:5 }
},
right: {code
val: 3, left: { val: 6 }, right: { val: 7 }
}
}
先實現三種遍歷的遞歸算法以做比較。遞歸
function DLR(root){io
if(root!=null){ console.log(root.val); DLR(root.left); DLR(root.right); }
}
DLR(root)//1,2,4,5,3,6,7console
function LDR(root){function
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,1while
看完上面的遞歸遍歷,下面對比一下非遞歸的二叉樹遍歷。你會發現遞歸真心簡單。
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