摘要:一個二叉樹的例子先實(shí)現(xiàn)三種遍歷的遞歸算法以作比較。先序遍歷遞歸算法中序遍歷遞歸算法先遍歷到最左邊的節(jié)點(diǎn),然后輸出后序遍歷看完上面的遞歸遍歷,下面對比一下非遞歸的二叉樹遍歷。終止條件最后樹遍歷完了自然就結(jié)束后序遍歷
二叉樹的遞歸遍歷很簡單就可以實(shí)現(xiàn),二叉樹非遞歸遍歷卻想不出來?那你可以看看下面的例子。
一個二叉樹的例子var root = {
val: 1,
left: {
val: 2, left: { val: 4, }, right:{ val:5 }
},
right: {
val: 3, left: { val: 6 }, right: { val: 7 }
}
}
先實(shí)現(xiàn)三種遍歷的遞歸算法以作比較。
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);//先遍歷到最左邊的節(jié)點(diǎn),然后輸出 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
看完上面的遞歸遍歷,下面對比一下非遞歸的二叉樹遍歷。你會發(fā)現(xiàn)遞歸真心簡單。
非遞歸前序遍歷function DLR(root){
var arr=[],res=[]; if(root!=null){ arr.push(root); } while(arr.length!=0){ var temp=arr.pop(); res.push(temp.val); //這里先放右邊再放左邊是因?yàn)槿〕鰜淼捻樞蛳喾? 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
非遞歸中序遍歷//先把左邊的,全部放進(jìn)arr再輸出,處理右邊的。
function LDR(root){
var arr=[],res=[]; while(true){ while(root!=null){ arr.push(root); root=root.left; } //終止條件:最后樹遍歷完了自然就結(jié)束 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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88416.html
摘要:對于任一重合元素,保證所在兩個局部遍歷有序,保證實(shí)現(xiàn)整體遍歷有序重合元素所在局部局部全部有序,遍歷該元素并出棧局部未全部有序,將未有序局部元素全部入棧。 二叉樹遍歷小結(jié) 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處: [1] https://segmentfault.com/u/yzwall [2] blog.csdn.net/j_dark/ 0 二叉樹遍歷概述 二叉樹遍歷:按照既定序,...
摘要:平衡二叉樹代碼實(shí)現(xiàn)根節(jié)點(diǎn)插入節(jié)點(diǎn)樹為空樹不為空比較小于往左走大于往右走空樹樹非空自平衡樹插入新節(jié)點(diǎn)向左走向左子樹拆入新節(jié)點(diǎn),且節(jié)點(diǎn)的值小于其左子節(jié)點(diǎn)時,應(yīng)該進(jìn)行旋轉(zhuǎn)。 平衡二叉樹JS代碼實(shí)現(xiàn) var Tree = function() { var Node = function(value) { this.value = value; this....
摘要:樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度。二叉樹有深度遍歷和廣度遍歷,深度遍歷有前序中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來顯示目錄結(jié)構(gòu)等中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用后序遍歷可以用來實(shí)現(xiàn)計算目錄內(nèi)的文件及其信息等。 樹的簡介 棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。樹型結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關(guān)系定義的層次結(jié)...
摘要:貌似大部分語言中的遞歸都差不多,之所以在標(biāo)題加是因?yàn)樗蚜讼潞蟾杏X網(wǎng)上用來描述這概念的不多,簡單地說遞歸就是函數(shù)調(diào)用自己的過程。 貌似大部分語言中的遞歸都差不多, 之所以在標(biāo)題加JS是因?yàn)樗蚜讼潞蟾杏X網(wǎng)上用js來描述這概念的不多, 簡單地說遞歸就是函數(shù)調(diào)用自己的過程。下面的栗子可以很直觀地展示遞歸的執(zhí)行過程: function rec(x){ if(x!==1){ console....
摘要:本文討論二叉樹的遍歷,對節(jié)點(diǎn)的訪問通過打印節(jié)點(diǎn)的值體現(xiàn)出來。從二叉樹的根節(jié)點(diǎn)出發(fā),遍歷可分為三個環(huán)節(jié)訪問節(jié)點(diǎn)打印節(jié)點(diǎn)的值遍歷節(jié)點(diǎn)的左子樹遍歷節(jié)點(diǎn)的右子樹不同環(huán)節(jié)執(zhí)行的先后順序產(chǎn)生了不同的遍歷方式。至于二叉樹的非遞歸遍歷,且聽下回分解。 相關(guān)概念 「樹的遍歷」 指按照一定規(guī)則不重復(fù)地訪問樹中所有節(jié)點(diǎn)的過程。「訪問」指針對節(jié)點(diǎn)的操作,如打印節(jié)點(diǎn)的值,更新節(jié)點(diǎn)的值等。 本文討論二叉樹的遍歷,...
閱讀 798·2021-09-06 15:02
閱讀 2439·2019-08-30 15:43
閱讀 2164·2019-08-30 11:26
閱讀 2372·2019-08-26 12:12
閱讀 3538·2019-08-23 18:24
閱讀 3254·2019-08-23 18:16
閱讀 695·2019-08-23 17:02
閱讀 2241·2019-08-23 15:34