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

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

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

二叉樹是由根節點,左子樹,右子樹組成,左子樹和友子樹分別是一個二叉樹。

這篇文章主要在JS中實現二叉樹的遍歷。

一個二叉樹的例子

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

  }

 }

}

廣度優先遍歷

廣度優先遍歷是從二叉樹的第一層(根結點)開始,自上至下逐層遍歷;在同一層中,按照從左到右的順序對結點逐一訪問。

實現:

<!--more-->

使用數組模擬隊列。首先將根節點歸入隊列。當隊列不為空的時候,執行循環:取出隊列的一個節點,如果該結點的左子樹為非空,則將該結點的左子樹入隊列;如果該結點的右子樹為非空,則將該結點的右子樹入隊列。

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

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)

 }

}

遞歸遍歷

覺得用這幾個字母表示遞歸遍歷的三種方法不錯:

D:訪問根結點,L:遍歷根結點的左子樹,R:遍歷根結點的右子樹。

先序遍歷:DLR

中序遍歷:LDR

后序遍歷:LRD

順著字母表示的意思念下來就是遍歷的順序了 ^ ^

這3種遍歷都屬于遞歸遍歷,或者說深度優先遍歷(Depth-First Search,DFS),因為它總

是優先往深處訪問。

先序遍歷的遞歸算法:

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);

 }

}

非遞歸深度優先遍歷

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

剛剛在廣度優先遍歷中使用的是隊列,相應的,在這種不遞歸的深度優先遍歷中我們使用棧。在JS中還是使用一個數組來模擬它。

這里只說先序的:

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

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)

 }

}

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

非遞歸中序

先把數的左節點推入棧,然后取出,再推右節點。

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

  }

 }

}

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

這里使用了一個臨時變量記錄上次入棧/出棧的節點。思路是先把根節點和左樹推入棧,然后取出左樹,再推入右樹,取出,最后取跟節點。

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

  }

 }

}

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

這個算法的思路和上面那個差不多,s1有點像一個臨時變量。

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遍歷

這個方法即不用遞歸也不用棧實現三種深度遍歷,空間復雜度為O(1)(這個概念我也不是特別清楚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) { 

以上就是本文的全部內容,希望對大家的學習有所幫助。

更多信息請查看網絡編程
易賢網手機網站地址:JS中的二叉樹遍歷詳解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲一区二区黄| 国产亚洲免费的视频看| 国产精品久久久久久久app| aa级大片欧美三级| 国产欧美精品在线播放| 久久人体大胆视频| 在线视频你懂得一区| 国产综合视频在线观看| 欧美乱在线观看| 毛片一区二区三区| 性色一区二区| 一区二区动漫| 亚洲人久久久| 国产一区二区欧美| 国产精品久久久久久一区二区三区 | 国产日韩精品综合网站| 欧美日韩国产在线播放| 美日韩免费视频| 久久男女视频| 午夜欧美大片免费观看 | 国产精品久久久久99| 欧美成熟视频| 欧美日韩伦理在线| 欧美激情亚洲国产| 欧美高清视频免费观看| 欧美日韩国产另类不卡| 欧美日韩成人综合| 欧美日韩国产一区| 国产精品久久久久一区二区| 欧美吻胸吃奶大尺度电影| 国产精品www色诱视频| 欧美日韩在线高清| 国产精品夜夜夜| 激情校园亚洲| 99精品欧美一区二区三区| 亚洲精品一二区| 亚洲欧美在线高清| 蜜桃av久久久亚洲精品| 欧美日韩免费在线视频| 影音先锋日韩资源| 最新热久久免费视频| 9l国产精品久久久久麻豆| 亚洲欧美文学| 欧美日韩精品免费观看视频| 国产精品成人va在线观看| 91久久精品国产91性色tv| 亚洲伊人第一页| 欧美高潮视频| 激情综合色综合久久| 亚洲综合另类| 欧美日韩综合网| 亚洲国产精品久久久久秋霞影院| 欧美一区三区二区在线观看| 欧美高清视频一区二区三区在线观看| 国产欧美日韩一区二区三区| 日韩亚洲在线观看| 欧美成人自拍| 日韩一区二区精品葵司在线| 久久综合九色欧美综合狠狠| 黄色成人av在线| 免费在线欧美黄色| 韩国在线视频一区| 六十路精品视频| 精品盗摄一区二区三区| 久久久久久一区二区| 国产亚洲欧洲997久久综合| 欧美在线视频一区二区三区| 国产精品区免费视频| 午夜视频在线观看一区| 国产专区精品视频| 老司机一区二区三区| av成人手机在线| 在线国产精品播放| 欧美精品精品一区| 亚洲欧美日韩在线高清直播| 国产欧美一区二区精品仙草咪| 先锋影音网一区二区| 狠狠色2019综合网| 欧美插天视频在线播放| 亚洲一级在线| 在线成人免费观看| 国产精品任我爽爆在线播放| 免费在线成人| 久久精品2019中文字幕| 亚洲破处大片| 揄拍成人国产精品视频| 国产精品成人观看视频国产奇米| 久久精品国产99国产精品澳门| 欧美国产日韩精品| 亚洲福利视频在线| 亚洲国产精品福利| 国产一区二区三区高清播放| 免费日韩一区二区| 一区二区高清视频| 一区在线免费| 国产一区二区三区在线播放免费观看| 欧美精品在线一区| 亚洲欧美一区二区视频| 久久国产福利国产秒拍| 亚洲视频网在线直播| 99热精品在线观看| 亚洲一区二区三区在线观看视频| 日韩一区二区精品葵司在线| 亚洲国产日韩一级| 99热这里只有成人精品国产| 午夜日韩在线观看| 很黄很黄激情成人| 欧美极品欧美精品欧美视频| 国产色产综合产在线视频| 亚洲福利视频一区二区| 日韩一级黄色片| 久久久久久电影| 欧美日韩成人在线| 国产精品视频午夜| 亚洲人成7777| 欧美影院在线播放| 欧美日韩亚洲一区三区 | 欧美一区二区精美| 久久天堂国产精品| 欧美另类高清视频在线| 国产亚洲精品福利| 99视频超级精品| 久久深夜福利免费观看| 国产日韩欧美夫妻视频在线观看| 亚洲另类黄色| 欧美精品一区二区三区很污很色的| 亚洲丁香婷深爱综合| 亚洲精品亚洲人成人网| 午夜精品免费| 国产精品久久久久aaaa樱花| 在线观看欧美精品| 欧美一区二区免费| 亚洲二区在线| 欧美激情1区2区3区| 亚洲婷婷综合色高清在线| 欧美一区二区成人| 国产精品mv在线观看| 亚洲美女在线一区| 欧美午夜国产| 在线视频日本亚洲性| 欧美日韩在线影院| 日韩亚洲欧美综合| 欧美小视频在线| 亚洲精品久久久久| 欧美大片免费久久精品三p| 亚洲福利视频一区| 欧美jizz19hd性欧美| 亚洲精品乱码久久久久久久久| 欧美在线视频一区二区三区| 国产专区精品视频| 欧美另类videos死尸| 亚洲综合色丁香婷婷六月图片| 国产精品久久久久久一区二区三区| 在线中文字幕一区| 黄色另类av| 国产精品久久久999| 欧美在线免费播放| 亚洲精品在线观看视频| 国产午夜精品全部视频播放| 浪潮色综合久久天堂| 亚洲欧美另类综合偷拍| 亚洲黄色精品| 一区二区三区在线观看欧美| 欧美人在线视频| 欧美va亚洲va国产综合| 一区二区三区日韩精品| 亚洲国产欧美日韩精品| 国产伦理一区| 欧美午夜一区二区福利视频| 蜜臀av一级做a爰片久久| 久久高清福利视频| 亚洲午夜免费视频| 亚洲免费av网站| 中文精品视频一区二区在线观看| 午夜国产精品影院在线观看| 好吊色欧美一区二区三区四区| 在线欧美小视频| 亚洲自拍偷拍麻豆| 国产精品hd| 宅男噜噜噜66国产日韩在线观看| 久久精品噜噜噜成人av农村| 国产三级欧美三级| 亚洲欧美欧美一区二区三区| 国产精品mv在线观看| 亚洲欧美变态国产另类| 国产欧美日韩亚洲| 欧美一级欧美一级在线播放| 国产精品欧美经典| 乱人伦精品视频在线观看| 黄色一区三区| 欧美日韩视频在线观看一区二区三区 | 欧美视频一区二区三区| 亚洲国产综合视频在线观看| 欧美日韩视频在线| 午夜精品久久久久久久99热浪潮| 国产日韩视频一区二区三区| 免费观看成人| 99精品国产高清一区二区| 国产精品免费区二区三区观看| 国产精品99久久久久久久女警|