中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JS中的二叉樹(shù)遍歷詳解
來(lái)源:易賢網(wǎng) 閱讀:1383 次 日期:2016-07-19 15:08:28
溫馨提示:易賢網(wǎng)小編為您整理了“JS中的二叉樹(shù)遍歷詳解”,方便廣大網(wǎng)友查閱!

這篇文章主要為大家詳細(xì)介紹了JS中的二叉樹(shù)遍歷,何為二叉樹(shù),什么是二叉樹(shù)的遍歷,感興趣的小伙伴們可以參考一下

二叉樹(shù)是由根節(jié)點(diǎn),左子樹(shù),右子樹(shù)組成,左子樹(shù)和友子樹(shù)分別是一個(gè)二叉樹(shù)。

這篇文章主要在JS中實(shí)現(xiàn)二叉樹(shù)的遍歷。

一個(gè)二叉樹(shù)的例子

var tree = {

 value: 1,

 left: {

  value: 2,

  left: {

   value: 4

  }

 },

 right: {

  value: 3,

  left: {

   value: 5,

   left: {

    value: 7

   },

   right: {

    value: 8

   }

  },

  right: {

   value: 6

  }

 }

}

廣度優(yōu)先遍歷

廣度優(yōu)先遍歷是從二叉樹(shù)的第一層(根結(jié)點(diǎn))開(kāi)始,自上至下逐層遍歷;在同一層中,按照從左到右的順序?qū)Y(jié)點(diǎn)逐一訪問(wèn)。

實(shí)現(xiàn):

<!--more-->

使用數(shù)組模擬隊(duì)列。首先將根節(jié)點(diǎn)歸入隊(duì)列。當(dāng)隊(duì)列不為空的時(shí)候,執(zhí)行循環(huán):取出隊(duì)列的一個(gè)節(jié)點(diǎn),如果該結(jié)點(diǎn)的左子樹(shù)為非空,則將該結(jié)點(diǎn)的左子樹(shù)入隊(duì)列;如果該結(jié)點(diǎn)的右子樹(shù)為非空,則將該結(jié)點(diǎn)的右子樹(shù)入隊(duì)列。

(描述有點(diǎn)不清楚,直接看代碼吧。)

var levelOrderTraversal = function(node) { 

 if(!node) {  

  throw new Error('Empty Tree')

 } 

 var que = []

 que.push(node) 

 while(que.length !== 0) {

  node = que.shift()  

  console.log(node.value)  

  if(node.left) que.push(node.left)  

  if(node.right) que.push(node.right)

 }

}

遞歸遍歷

覺(jué)得用這幾個(gè)字母表示遞歸遍歷的三種方法不錯(cuò):

D:訪問(wèn)根結(jié)點(diǎn),L:遍歷根結(jié)點(diǎn)的左子樹(shù),R:遍歷根結(jié)點(diǎn)的右子樹(shù)。

先序遍歷:DLR

中序遍歷:LDR

后序遍歷:LRD

順著字母表示的意思念下來(lái)就是遍歷的順序了 ^ ^

這3種遍歷都屬于遞歸遍歷,或者說(shuō)深度優(yōu)先遍歷(Depth-First Search,DFS),因?yàn)樗?/P>

是優(yōu)先往深處訪問(wèn)。

先序遍歷的遞歸算法:

var preOrder = function (node) { 

 if (node) {  

  console.log(node.value);

  preOrder(node.left);

  preOrder(node.right);

 }

}

中序遍歷的遞歸算法:

var inOrder = function (node) { 

 if (node) {

  inOrder(node.left);  

  console.log(node.value);

  inOrder(node.right);

 }

}

后序遍歷的遞歸算法:

var postOrder = function (node) { 

 if (node) {

  postOrder(node.left);

  postOrder(node.right);  

  console.log(node.value);

 }

}

非遞歸深度優(yōu)先遍歷

其實(shí)對(duì)于這些概念誰(shuí)是屬于誰(shuí)的我也搞不太清楚。有的書(shū)里將二叉樹(shù)的遍歷只講了上面三種遞歸遍歷。有的分廣度優(yōu)先遍歷和深度優(yōu)先遍歷兩種,把遞歸遍歷都分入深度遍歷當(dāng)中;有的分遞歸遍歷和非遞歸遍歷兩種,非遞歸遍歷里包括廣度優(yōu)先遍歷和下面這種遍歷。個(gè)人覺(jué)得怎么分其實(shí)并不重要,掌握方法和用途就好 :)

剛剛在廣度優(yōu)先遍歷中使用的是隊(duì)列,相應(yīng)的,在這種不遞歸的深度優(yōu)先遍歷中我們使用棧。在JS中還是使用一個(gè)數(shù)組來(lái)模擬它。

這里只說(shuō)先序的:

額,我嘗試了描述這個(gè)算法,然而并描述不清楚,按照代碼走一邊你就懂了。

var preOrderUnRecur = function(node) { 

 if(!node) {  

  throw new Error('Empty Tree')

 } 

 var stack = []

 stack.push(node) 

 while(stack.length !== 0) {

  node = stack.pop()  

  console.log(node.value)  

  if(node.right) stack.push(node.right)  

  if(node.left) stack.push(node.left)

 }

}

看了這一篇,找到了非遞歸后序的算法,所以在這里把非遞歸的遍歷方法補(bǔ)充完整。

非遞歸中序

先把數(shù)的左節(jié)點(diǎn)推入棧,然后取出,再推右節(jié)點(diǎn)。

var inOrderUnRecur = function(node) { 

 if(!node) {  

  throw new Error('Empty Tree')

 } 

 var stack = [] 

 while(stack.length !== 0 || node) {  

  if(node) {

   stack.push(node)

   node = node.left

  } else {

   node = stack.pop()   

   console.log(node.value)

   node = node.right

  }

 }

}

非遞歸后序(使用一個(gè)棧)

這里使用了一個(gè)臨時(shí)變量記錄上次入棧/出棧的節(jié)點(diǎn)。思路是先把根節(jié)點(diǎn)和左樹(shù)推入棧,然后取出左樹(shù),再推入右樹(shù),取出,最后取跟節(jié)點(diǎn)。

var posOrderUnRecur = function(node) { 

 if(!node) {  

  throw new Error('Empty Tree')

 } 

 var stack = []

 stack.push(node) 

 var tmp = null

 while(stack.length !== 0) {

  tmp = stack[stack.length - 1]  

  if(tmp.left && node !== tmp.left && node !== tmp.right) {

   stack.push(tmp.left)

  } else if(tmp.right && node !== tmp.right) {

   stack.push(tmp.right)

  } else {   

   console.log(stack.pop().value)

   node = tmp

  }

 }

}

非遞歸后序(使用兩個(gè)棧)

這個(gè)算法的思路和上面那個(gè)差不多,s1有點(diǎn)像一個(gè)臨時(shí)變量。

var posOrderUnRecur = function(node) { 

 if(node) {  

  var s1 = []  

  var s2 = []

  s1.push(node)  

  while(s1.length !== 0) {

   node = s1.pop()

   s2.push(node)   

   if(node.left) {

    s1.push(node.left)

   }   

   if(node.right) {

    s1.push(node.right)

   }

  }  

  while(s2.length !== 0) {   

   console.log(s2.pop().value);

  }

 }

}

Morris遍歷

這個(gè)方法即不用遞歸也不用棧實(shí)現(xiàn)三種深度遍歷,空間復(fù)雜度為O(1)(這個(gè)概念我也不是特別清楚org)

(這三種算法我先放著,有空再研究)

Morris先序:

var morrisPre = function(head) { 

 if(!head) {  

  return

 } 

 var cur1 = head,

   cur2 = null

 while(cur1) {

  cur2 = cur1.left  

  if(cur2) {   

   while(cur2.right && cur2.right != cur1) {

    cur2 = cur2.right

   }   

   if(!cur2.right) {

    cur2.right = cur1    

    console.log(cur1.value)

    cur1 = cur1.left    

    continue

   } else {

    cur2.right = null

   }

  } else {   

    console.log(cur1.value)

  }

  cur1 = cur1.right

 }

}

Morris中序:

var morrisIn = function(head) { 

 if(!head) {  

  return

 } 

 var cur1 = head,

   cur2 = null

 while(cur1) {

  cur2 = cur1.left  

  if(cur2) {   

   while(cur2.right && cur2.right !== cur1) {

    cur2 = cur2.right

   }   

   if(!cur2.right) {

    cur2.right = cur1

    cur1 = cur1.left    

    continue

   } else {

    cur2.right = null

   }

  }  

  console.log(cur1.value)

  cur1 = cur1.right

 }

}

Morris后序:

var morrisPost = function(head) { 

 if(!head) {  

  return

 } 

 var cur1 = head,

   cur2 = null

 while(cur1) {

  cur2 = cur1.left  

  if(cur2) {   

   while(cur2.right && cur2.right !== cur1) {

    cur2 = cur2.right

   }   

   if(!cur2.right) {

    cur2.right = cur1

    cur1 = cur1.left    

    continue

   } else {

    cur2.right = null

    printEdge(cur1.left)

   }

  }

  cur1 = cur1.right

 }

 printEdge(head)

}

var printEdge = function(head) { 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:JS中的二叉樹(shù)遍歷詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn)

版權(quán)所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲成a人在线观看| 国产无人区一区二区三区| av毛片久久久久**hd| 欧美精品久久天天躁| 艳妇臀荡乳欲伦亚洲一区| 在线视频综合导航| 中文字幕中文乱码欧美一区二区| 激情小说欧美图片| 久久久久久麻豆| 韩国视频一区二区| 26uuu国产电影一区二区| 精品一区二区三区蜜桃| 精品动漫一区二区三区在线观看| 精东粉嫩av免费一区二区三区 | 中文字幕在线不卡| 懂色中文一区二区在线播放| 亚洲色图欧美激情| 欧美日韩午夜在线| 成人午夜免费av| 亚洲午夜羞羞片| 欧美xxxxxxxx| 色综合天天性综合| 久久国产三级精品| 国产婷婷色一区二区三区| 在线一区二区视频| 久久精品国产999大香线蕉| 亚洲免费成人av| 欧美成人一区二区三区片免费| 成人综合日日夜夜| 水蜜桃久久夜色精品一区的特点| 中文字幕欧美日韩一区| 在线区一区二视频| 国产一区二区h| 最新久久zyz资源站| 精品国产三级a在线观看| 99精品视频在线观看免费| 青青草国产精品亚洲专区无| 国产精品区一区二区三区| 精品视频在线免费| 91麻豆国产精品久久| 日韩在线a电影| 一区二区三区电影在线播| 国产日韩亚洲欧美综合| 欧美变态tickling挠脚心| 欧美精品1区2区| 91在线观看下载| 成人av网站免费观看| 国产不卡视频在线播放| 国产一区二区调教| 国模套图日韩精品一区二区| 免费精品视频在线| 免费成人在线网站| 日本亚洲电影天堂| 日韩中文字幕一区二区三区| 亚洲一区二区三区影院| 一区二区三区在线观看视频 | 2023国产一二三区日本精品2022| 欧美欧美欧美欧美首页| 欧美日韩一级黄| 欧美三级中文字幕在线观看| 欧美影院精品一区| 欧美精品日韩精品| 日韩三级免费观看| 久久伊99综合婷婷久久伊| 国产无一区二区| 亚洲免费视频成人| 午夜av一区二区| 精品一区二区在线视频| 成人午夜精品在线| 99精品国产99久久久久久白柏| av在线一区二区三区| 91九色02白丝porn| 欧美一区二区三区四区在线观看| 日韩精品专区在线影院观看| 久久久久国产精品免费免费搜索| 国产精品久久夜| 亚洲精品视频在线观看网站| 午夜精彩视频在线观看不卡| 韩国在线一区二区| 91碰在线视频| 欧美一卡二卡在线观看| 国产视频一区在线播放| 悠悠色在线精品| 激情综合色丁香一区二区| 成人免费av资源| 欧美日本不卡视频| 日本一区二区三级电影在线观看 | 久久一区二区三区四区| 国产精品剧情在线亚洲| 亚洲无线码一区二区三区| 美女视频黄频大全不卡视频在线播放| 蜜臀av性久久久久av蜜臀妖精| 国产乱码精品一区二区三区忘忧草| 91老司机福利 在线| 欧美一区二区日韩一区二区| 国产精品美女一区二区三区| 全国精品久久少妇| 一本到三区不卡视频| 久久综合九色综合欧美98| 亚洲精品高清视频在线观看| 激情小说亚洲一区| 欧美日韩成人激情| 成人免费在线视频| 国内不卡的二区三区中文字幕| 色94色欧美sute亚洲线路一ni | 成人永久免费视频| 日韩欧美国产1| 一区二区三区电影在线播| 国产精品一区二区在线看| 欧美人伦禁忌dvd放荡欲情| 欧美激情艳妇裸体舞| 经典三级一区二区| 欧美一区二区三区的| 亚洲国产精品久久不卡毛片| 成人精品视频网站| 久久天天做天天爱综合色| 免费观看91视频大全| 欧美日韩综合在线| 自拍偷自拍亚洲精品播放| 国产成人一级电影| 久久久精品国产免大香伊 | 久久99国产精品免费网站| 欧美日韩一区二区三区四区五区| 欧美国产综合一区二区| 国产一区999| 国产亚洲成aⅴ人片在线观看| 麻豆精品一区二区三区| 日韩免费看的电影| 久久国产婷婷国产香蕉| 欧美xxxxx裸体时装秀| 韩国视频一区二区| 久久久久青草大香线综合精品| 精品在线观看免费| 久久久久久久久久久久电影| 国产经典欧美精品| 国产精品午夜久久| 91色.com| 亚洲成人免费在线| 51久久夜色精品国产麻豆| 日韩电影在线观看电影| 日韩欧美在线一区二区三区| 精一区二区三区| 久久美女艺术照精彩视频福利播放 | 亚洲丝袜另类动漫二区| 91在线视频网址| 亚洲一二三区视频在线观看| av资源网一区| 久久久国产精华| 91在线视频观看| 婷婷六月综合亚洲| 久久人人爽爽爽人久久久| 国产白丝网站精品污在线入口| 中文字幕精品在线不卡| 91老师国产黑色丝袜在线| 图片区日韩欧美亚洲| 久久综合99re88久久爱| 99久久精品国产毛片| 午夜精品一区二区三区免费视频| 日韩欧美国产一区二区在线播放| 国产精品一区二区黑丝| 亚洲一区在线观看免费 | 欧美一级日韩一级| 成人三级在线视频| 午夜影院在线观看欧美| 亚洲精品一区二区三区福利| 成人av在线资源网站| 婷婷国产在线综合| 国产精品久久777777| 欧美精品aⅴ在线视频| 成人av在线播放网址| 五月天视频一区| 最新国产成人在线观看| 欧美一级黄色录像| 色婷婷久久综合| 国产乱对白刺激视频不卡| 一区二区三区在线播放| 国产丝袜欧美中文另类| 欧美一区二区三区视频免费| 97久久超碰精品国产| 国模套图日韩精品一区二区| 午夜精品久久久| 一区二区三区在线观看动漫| 国产日产欧产精品推荐色 | 亚洲蜜桃精久久久久久久| 2021中文字幕一区亚洲| 欧美日韩国产综合视频在线观看| 成人综合婷婷国产精品久久| 激情欧美一区二区三区在线观看| 一区二区高清免费观看影视大全 | 国产一区二区三区观看| 天天综合色天天| 亚洲一区二区三区四区五区黄| 国产精品久久久久国产精品日日| 久久伊99综合婷婷久久伊| 69av一区二区三区| 91伊人久久大香线蕉| 国产精品影视网| 美美哒免费高清在线观看视频一区二区| 国产精品嫩草影院com| 久久九九影视网|