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

JS中的二叉樹(shù)遍歷詳解
來(lái)源:易賢網(wǎng) 閱讀:1341 次 日期: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)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久免费视频在线| 久久国产综合精品| 美女网站久久| 亚洲永久在线观看| 99re6热在线精品视频播放速度| 国产一区999| 国产欧美欧美| 国产精品综合| 国产精品毛片在线| 国产精品久久久久影院亚瑟| 欧美日韩亚洲综合| 欧美日韩一区三区四区| 欧美久久久久久久久久| 欧美精品一区三区在线观看| 欧美激情欧美激情在线五月| 你懂的国产精品| 欧美大学生性色视频| 欧美成人有码| 欧美久久精品午夜青青大伊人| 免费观看成人| 欧美电影免费观看网站| 欧美精品一区在线发布| 欧美日韩精品二区第二页| 欧美日韩天堂| 国产精品一区二区三区四区| 国产亚洲精品久久久久婷婷瑜伽| 国产日韩欧美一区在线| 国产中文一区二区三区| 怡红院精品视频| 亚洲激情自拍| 国产精品99久久久久久久女警| 亚洲专区一区| 久久精品99国产精品酒店日本| 久久精品国产一区二区三| 久久综合999| 欧美另类一区| 国产精品日韩一区二区三区| 国产一区二区久久久| 亚洲国产欧美在线| 亚洲午夜伦理| 开心色5月久久精品| 欧美伦理91i| 国产欧美一区二区精品性色| 亚洲视频专区在线| 亚洲欧美中日韩| 久久人人97超碰精品888| 欧美精品午夜视频| 国产欧美日韩伦理| 亚洲国产精品一区二区久| 亚洲香蕉在线观看| 久久免费少妇高潮久久精品99| 欧美人成免费网站| 国产亚洲欧美日韩美女| 亚洲欧洲日本专区| 欧美伊人精品成人久久综合97| 欧美成在线视频| 国产乱码精品一区二区三区五月婷 | 91久久精品www人人做人人爽| 在线午夜精品自拍| 久久综合久色欧美综合狠狠| 国产精品久久久久久久久免费樱桃| 尤物网精品视频| 亚洲欧美在线aaa| 欧美精品免费在线观看| 国产一区视频在线观看免费| 亚洲视频一区| 欧美激情网友自拍| 在线观看欧美激情| 久久九九精品99国产精品| 欧美三区视频| 亚洲精品少妇| 欧美成年人网站| 韩日精品在线| 午夜精品一区二区三区在线视| 欧美日韩国产成人| 亚洲欧洲另类| 欧美激情精品久久久久久蜜臀| 在线日韩日本国产亚洲| 久久国产精品99国产| 国产欧美一区二区三区在线看蜜臀| 在线视频精品一区| 欧美日韩色一区| 夜久久久久久| 欧美日韩亚洲一区二区三区在线 | 欧美日韩高清在线| 亚洲国产黄色片| 久久一区二区三区四区| 国产区精品在线观看| 亚洲综合视频一区| 国产精品久久久久久久免费软件| 9国产精品视频| 欧美日韩免费观看中文| 一本色道久久99精品综合| 在线免费观看一区二区三区| 久久精品视频va| 国内精品视频一区| 久久蜜桃资源一区二区老牛 | 亚洲国内精品在线| 欧美不卡视频一区发布| 在线日韩欧美| 欧美激情第一页xxx| av成人免费在线观看| 欧美视频成人| 亚洲一区在线直播| 国产一区二区三区在线观看网站| 久久精品一区蜜桃臀影院| 精品99一区二区| 欧美国产日韩一二三区| 一区二区三区www| 国产欧美日韩专区发布| 久久久精品网| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美日韩一区在线观看| 国产精品久久久久毛片大屁完整版 | 午夜久久久久久| 国产欧美一区二区白浆黑人| 久久精品国产亚洲一区二区三区 | 久久一区免费| 亚洲免费福利视频| 国产欧美日韩免费| 嫩草成人www欧美| 亚洲视屏在线播放| 国产综合色精品一区二区三区| 农夫在线精品视频免费观看| 亚洲深夜福利视频| 国一区二区在线观看| 欧美另类一区| 久久精品国产在热久久 | 国模精品娜娜一二三区| 免费日韩成人| 亚洲欧美国产高清| 亚洲国产精品一区二区久| 国产精品99一区| 久久美女性网| 亚洲欧美自拍偷拍| 日韩亚洲成人av在线| 红桃视频国产精品| 欧美手机在线| 欧美成人综合一区| 久久国产精品久久国产精品| 日韩视频免费观看高清在线视频 | 日韩午夜在线| 国产乱子伦一区二区三区国色天香 | 欧美aⅴ99久久黑人专区| 一区二区三区欧美在线| 一区精品在线播放| 国产精品一二一区| 欧美日韩亚洲高清一区二区| 久久永久免费| 欧美一区二区三区四区夜夜大片| 9色国产精品| 亚洲精品国产日韩| 一区二区三区在线高清| 国产欧美日韩在线观看| 国产精品成人在线观看| 欧美日韩第一区| 欧美激情亚洲一区| 欧美.com| 玖玖玖免费嫩草在线影院一区| 久久成人免费电影| 午夜亚洲视频| 午夜精品视频一区| 亚洲女同在线| 亚洲一区尤物| 亚洲欧美经典视频| 亚洲视频碰碰| 中日韩视频在线观看| 亚洲欧洲在线一区| 亚洲精品视频免费观看| 亚洲精品1区2区| 亚洲黑丝一区二区| 亚洲国产第一页| 91久久精品久久国产性色也91| 在线看国产一区| 1024成人| 亚洲国产天堂久久综合| 亚洲高清不卡av| 亚洲人成绝费网站色www| 亚洲国产aⅴ天堂久久| 亚洲第一福利在线观看| 亚洲国产高清自拍| 亚洲欧洲一区二区三区久久| 亚洲精品久久久久久久久久久久| 亚洲精品字幕| 亚洲视频日本| 欧美一区二区在线看| 久久久99国产精品免费| 久久综合给合久久狠狠色| 蜜臀av一级做a爰片久久| 欧美福利一区二区三区| 欧美日韩大片| 国产精品久久久久久久久借妻| 国产精品午夜av在线| 国产欧美欧美| 在线观看日韩av先锋影音电影院 | 亚洲资源av| 久久爱另类一区二区小说| 久久深夜福利免费观看| 欧美激情 亚洲a∨综合| 欧美日韩亚洲网|