JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-二叉樹

前言:

之前做百度前端練習題時,遇到二叉樹遍歷的問題,由于不了解二叉樹這種數(shù)據(jù)機構(gòu),自己只好學習一番并且總結(jié)如下。

樹的簡介

棧、隊列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關系定義的層次結(jié)構(gòu)。

基礎概念

樹的定義

樹(Tree)是n(n>=0)個結(jié)點的有限集。
在一顆非空樹里:

  • 有且只有一個根節(jié)點(root)
  • 當n>1時,其余結(jié)點可分為m(m>0)個互不相交的有限集T1,T2,T3,...Tm,其中每一個集合本身又是一棵樹,并且稱為根的子樹(Subtree)。

(a) 圖只有一個根節(jié)點A ,(b)A是根節(jié)點,13個子節(jié)點,13個子節(jié)點分成3個互不相交的子集:T1={B,E,F,K,L},t2={D,H,I,J,M};T1,T2和T3都是根A的子樹,且本身也是一棵樹。

樹的節(jié)點

樹中的每個元素,都叫做節(jié)點。
樹的結(jié)點包含一個數(shù)據(jù)元素及若干指向其子樹的分支。該節(jié)點的子樹被稱為該節(jié)點的孩子并且該節(jié)點同時也是孩子的雙親

度:節(jié)點擁有的子樹數(shù)目被稱為

例如(b)B節(jié)點的度為2,D節(jié)點的度為3,度為0的節(jié)點稱為葉子或者終端結(jié)點,反之稱為非終端結(jié)點或分支結(jié)點。該樹的度為擁有節(jié)點的度的最大值

節(jié)點的層次

節(jié)點的層次(Level)從根開始定義起,根為第一層,然后為第二層,依次順序下去為n層。

深度: 樹中節(jié)點的最大層數(shù)被稱為樹的深度或高度

例如 (b)樹的深度為4

有序和無序樹

如果將樹中節(jié)點的各子樹看成從左至右是有次序的(即不能交換),則稱該樹為有序樹,否則稱為無序樹。在有序樹中最左邊的子樹的根稱為第一個孩子,最右邊的稱為最后一個孩子。

森林

森林(Forest)是m(m>=0)棵互不相交的樹的集合。對樹中每個結(jié)點而言,其子樹的集合即為森林。


二叉樹

二叉樹(Binary Tree)是另一種樹型結(jié)構(gòu),它的特點是每個結(jié)點至多只有兩棵子樹(即二叉樹中不存在度大于2的結(jié)點),并且,二叉樹的子樹有左右之分(其次序不能任意顛倒。)

二叉樹的性質(zhì)

  • 二叉樹的第i層上最多有2的(i-1)方個節(jié)點。(i>=1)
  • 深度為k的樹最多有2的k次方-1個節(jié)點。(k>=1)
  • 對任何一棵二叉樹T,如果其終端結(jié)點數(shù)為n0,度為2的結(jié)點數(shù)為n2,則n0 = n2 + 1;
  • 一棵深度為k且有2的k次方-1個結(jié)點的二叉樹稱為滿二叉樹
  • 深度為k的,有n個結(jié)點的二叉樹,當且僅當其每一個結(jié)點都與深度為k的滿二叉樹中編號從1至n的結(jié)點一一對應時,稱之為完全二叉樹
    (我的理解是有限的節(jié)點個數(shù)里從左到右的編號要一一對應,否則不能稱為完全二叉樹)

注意:滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。

二叉樹的5個基本形態(tài)

  • 空二叉樹
  • 只有一個根結(jié)點
  • 根結(jié)點只有左子樹
  • 根結(jié)點只有右子樹
  • 根結(jié)點既有左子樹又有右子樹

二叉樹的存儲結(jié)構(gòu)

  • 順序存儲結(jié)構(gòu)

    用一維數(shù)組依照順序存儲樹的節(jié)點,編號為i節(jié)點依次存儲在數(shù)組下標i-1的元素里。i為0意味不存在此節(jié)點,這樣的順序存儲適合完全二叉樹。但是最壞的情況下,深刻為k并且只有k個節(jié)點的二叉樹(每個節(jié)點的度小于2),那么意味著需要長度為2的k次方-1的一維數(shù)組來存儲,非常浪費存儲空間。

  • 鏈式存儲結(jié)構(gòu)

    二叉樹的結(jié)點由一個數(shù)據(jù)元素和分別指向其左右子樹的兩個分支構(gòu)成,則表示二叉樹的鏈表中的結(jié)點至少包含三個域:數(shù)據(jù)域和左右指針域。有時,為了便于找到結(jié)點的雙親,則還可在結(jié)點結(jié)構(gòu)中增加一個指向其雙親結(jié)點的指針域。利用這兩種結(jié)構(gòu)所得的二叉樹的存儲結(jié)構(gòu)分別稱之為二叉鏈表和三叉鏈表。
    在含有n個結(jié)點的二叉鏈表中有n+1個空鏈域,我們可以利用這些空鏈域存儲其他有用信息,從而得到另一種鏈式存儲結(jié)構(gòu)---線索鏈表。

二叉樹的遍歷

二叉樹的遍歷(traversing binary tree)是指從根結(jié)點出發(fā),按照某種次序依次訪問二叉樹中所有結(jié)點,使得每個結(jié)點被訪問一次且僅被訪問一次。

二叉樹的遍歷有三種方式,如下:

  • (1)前序遍歷(DLR),首先訪問根結(jié)點,然后遍歷左子樹,最后遍歷右子樹。簡記根-左-右。

  • (2)中序遍歷(LDR),首先遍歷左子樹,然后訪問根結(jié)點,最后遍歷右子樹。簡記左-根-右。

  • (3)后序遍歷(LRD),首先遍歷左子樹,然后遍歷右子樹,最后訪問根結(jié)點。簡記左-右-根。

前序遍歷(DLR)

算法思路
若二叉樹為空,則遍歷結(jié)束;否則

⑴ 訪問根結(jié)點;

⑵ 先序遍歷左子樹(遞歸調(diào)用本算法);

⑶ 先序遍歷右子樹(遞歸調(diào)用本算法)。

遍歷的順序為:A B D H I E J C F K G

算法實現(xiàn)

//先序遍歷
function preOrder(node){
    if(!node == null){
        putstr(node.show()+ " ");
        preOrder(node.left);
        preOrder(node.right);
    }
}
中序遍歷(LDR)

算法思路
若二叉樹為空,則遍歷結(jié)束;否則

⑴ 中序遍歷左子樹(遞歸調(diào)用本算法);

⑵ 訪問根結(jié)點;

⑶ 中序遍歷右子樹(遞歸調(diào)用本算法)。

遍歷的順序為:A B D H I E J C F K G

算法實現(xiàn)

//使用遞歸方式實現(xiàn)中序遍歷
function inOrder(node){
    if(!(node == null)){
        inOrder(node.left);//先訪問左子樹
        putstr(node.show()+ " ");//再訪問根節(jié)點
        inOrder(node.right);//最后訪問右子樹
    }
}
后序遍歷(LRD)

算法思路
若二叉樹為空,則遍歷結(jié)束;否則

⑴ 后序遍歷左子樹(遞歸調(diào)用本算法);

⑵ 后序遍歷右子樹(遞歸調(diào)用本算法) ;

⑶ 訪問根結(jié)點 。

遍歷的順序為:H I D J E B K F G C A

算法實現(xiàn)

//后序遍歷
function postOrder(node){
    if(!node == null){
        postOrder(node.left);
        postOrder(node.right);
        putStr(node.show()+ " ");
    }
}

個人水平有限,如有錯誤,還望指正,感激不盡!!!


參考鏈接

javascript實現(xiàn)數(shù)據(jù)結(jié)構(gòu): 樹和二叉樹,二叉樹的遍歷和基本操作

JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹詳解

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內(nèi)容