javascript實現(xiàn)多叉樹 深度優(yōu)先遍歷和廣度優(yōu)先遍歷(代碼簡潔易懂)

本文目錄

  1. 回顧數(shù)組本篇使用的五個方法
  2. 深度優(yōu)先遍歷 (遞歸方法) 思路+代碼
  3. 深度優(yōu)先遍歷 (非遞歸方法) 思路+代碼
  4. 廣度優(yōu)先遍歷 (非遞歸方法) 思路+代碼

雖然剛好舉的例子是二叉樹,但是幾個叉都能遍歷哈,因為遍歷思路和叉數(shù)沒關(guān)系

需求:遍歷root拿到所有的 'name' 值

var root = {
      name: 'A',
      children: [
        { 
          name: 'B1',
          children: [
            { 
              name: 'C1',
              children: [
                { 
                  name: 'D',
                  children: [
                        { 
                            name: 'D1' ,
                            children: [{name: 'F1 '},{name: 'F2'}]
                        }, 
                        { name: 'D2' }
                  ]
                }
              ]
            }
          ]
        },
        {
          name: 'B2',
          children: [ {name: 'C2' }, { name: 'C3' } ]
        }
      ]
    }
image.png

1. 首先回顧下本篇用到的數(shù)組的5個方法

方法 參數(shù) 作用 返回值
arr.unshift(1) 要插入的值 向數(shù)組頭部插入一個值 新數(shù)組length
arr.shift() 從數(shù)組頭部取出一個值 取出的值
arr.push(1) 要放入的值 向數(shù)組尾部放入一個值 新數(shù)組length
arr.pop() 從數(shù)組尾部取出一個值 取出的值
arr.reverse() 反轉(zhuǎn)數(shù)組的值

2. 深度優(yōu)先遍歷 (遞歸方法) => 前序遍歷

前序遍歷: 根節(jié)點--> 左節(jié)點 --> 右節(jié)點

let arr = [];     // 存放遍歷得到的 'name' 的值
function traverseTree(node) {
  if (!node) {
    return;
  }
  arr.push(node.name)
  if (node.children && node.children.length > 0) {
    node.children.map(item => this.traverseTree(item))  // 遞歸調(diào)用該函數(shù)
  }
  return arr
}
traverseTree(root);

3. 深度優(yōu)先遍歷 (非遞歸方法) 思路+代碼 => 前序遍歷

思路:
1:聲明一個數(shù)組用于存放所有的節(jié)點;
2:通過循環(huán)依次從數(shù)組stack頭部拿一個節(jié)點進(jìn)行遍歷沈矿;
3:若其有子節(jié)點,則將其子節(jié)點(即tmpNode)放入stack隊頭憨攒;
4:若其無子節(jié)點,則再次進(jìn)入while循環(huán);

function traverseTree2(node) {
  if (!node) {
    return;
  }
  let stack = [];     // 用于存放所有待處理節(jié)點
  let arr = [];         // 存放遍歷后的結(jié)果
  let tmpNode;     //當(dāng)前正在被處理的節(jié)點
  stack.push(node);
  while (stack.length) {
    tmpNode = stack.shift(); // !!
    arr.push(tmpNode.name)
    if (tmpNode.children && tmpNode.children.length) {
      tmpNode.children.reverse().map(item => stack.unshift(item))  // !!廣度和深度唯一的區(qū)別在這里
    }
  }
  return arr
}

廣度優(yōu)先遍歷 (非遞歸方法) 思路+代碼 => 按層遍歷

思路:
與深度優(yōu)先唯一不同點是遍歷當(dāng)前節(jié)點時,若其有子節(jié)點時, 則將其子節(jié)點放于stack的尾部;

function traverseTree3(node) {
  if (!node) {
    return;
  }
   let stack = [];     // 用于存放所有待處理節(jié)點
  let arr = [];         // 存放遍歷后的結(jié)果
  let tmpNode;     //當(dāng)前正在被處理的節(jié)點

  stack.push(node);
  while (stack.length) {
    tmpNode = stack.shift();   // !!
    // 當(dāng)前節(jié)點的'name'屬性放進(jìn)arr
    arr.push(tmpNode.name);
    if (tmpNode.children && tmpNode.children.length) {
      tmpNode.children.map(item => stack.push(item)) // !!
    }
  }
  return arr;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掸冤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子考婴,更是在濱河造成了極大的恐慌贩虾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沥阱,死亡現(xiàn)場離奇詭異,居然都是意外死亡伊群,警方通過查閱死者的電腦和手機(jī)考杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舰始,“玉大人崇棠,你說我怎么就攤上這事⊥杈恚” “怎么了枕稀?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谜嫉。 經(jīng)常有香客問我萎坷,道長,這世上最難降的妖魔是什么沐兰? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任哆档,我火速辦了婚禮,結(jié)果婚禮上住闯,老公的妹妹穿的比我還像新娘瓜浸。我一直安慰自己,他們只是感情好比原,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布插佛。 她就那樣靜靜地躺著,像睡著了一般量窘。 火紅的嫁衣襯著肌膚如雪雇寇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音谢床,去河邊找鬼兄一。 笑死,一個胖子當(dāng)著我的面吹牛识腿,可吹牛的內(nèi)容都是我干的出革。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼渡讼,長吁一口氣:“原來是場噩夢啊……” “哼骂束!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起成箫,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤展箱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹬昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混驰,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年皂贩,在試婚紗的時候發(fā)現(xiàn)自己被綠了栖榨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡明刷,死狀恐怖婴栽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辈末,我是刑警寧澤愚争,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站挤聘,受9級特大地震影響轰枝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬洞,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一狸膏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添怔,春花似錦湾戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艾杏,卻和暖如春韧衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工畅铭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留氏淑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓硕噩,卻偏偏與公主長得像假残,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炉擅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345