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

二叉樹和二叉搜索樹


ps:整個文章所涉及的源代碼我都發(fā)布在我的Github主頁上,大家可以自行下載,如果對您有一丟丟的幫助的話,記得在我的github項目上點(diǎn)上【star】喲,當(dāng)然不要忘了在本篇文章下方【點(diǎn)贊】啦,你們的支持將是我最大的動力!

(利他之心是每個優(yōu)秀開發(fā)者的傳統(tǒng)美德!——@惜墨的少年


樹的相關(guān)術(shù)語

一個樹結(jié)構(gòu)包含一系列存在父子關(guān)系的節(jié)點(diǎn)。除了頂部的第一個節(jié)點(diǎn),每個節(jié)點(diǎn)都有一個父節(jié)點(diǎn)以及零個或多個子節(jié)點(diǎn)。樹頂部的節(jié)點(diǎn)叫做根節(jié)點(diǎn),它沒有父節(jié)點(diǎn)。樹中每個元素叫做節(jié)點(diǎn),節(jié)點(diǎn)分為內(nèi)部節(jié)點(diǎn)和外部節(jié)點(diǎn)。至少有一個子節(jié)點(diǎn)的節(jié)點(diǎn)稱為內(nèi)部節(jié)點(diǎn)。沒有子元素的節(jié)點(diǎn)稱為外部節(jié)點(diǎn)即葉子節(jié)點(diǎn)。

有關(guān)樹的另外一個術(shù)語是子樹。子樹由節(jié)點(diǎn)和它的后代構(gòu)成。節(jié)點(diǎn)的一個屬性是深度,節(jié)點(diǎn)的深度取決于它的祖先節(jié)點(diǎn)的數(shù)量。樹的高度取決于所有節(jié)點(diǎn)深度的最大值。一棵樹也可以分解成層級。根節(jié)點(diǎn)在第0層,它的子節(jié)點(diǎn)在第1層,以此類推。

二叉樹和二叉搜索樹

二叉樹中的節(jié)點(diǎn)最多只能有兩個子節(jié)點(diǎn):一個是左側(cè)子節(jié)點(diǎn),另一個是右側(cè)子節(jié)點(diǎn)。二叉搜索樹(BST)是二叉樹的一種,但是只允許在左側(cè)節(jié)點(diǎn)存儲(比父節(jié)點(diǎn))小的值,在右側(cè)節(jié)點(diǎn)存儲(比父節(jié)點(diǎn))大(或者等于)的值。下面以二叉搜索樹為例。

創(chuàng)建 Node 類

Node 類

創(chuàng)建 BinarySearchTree 類

BinarySearchTree 類
insert()
insertNode()

中序遍歷

中序遍歷是一種以上行順序訪問BST所有節(jié)點(diǎn)的遍歷方式,也就是以從小到大的順序訪問所有節(jié)點(diǎn)。中序遍歷的一種應(yīng)用是對樹進(jìn)行排序操作。

中序遍歷邏輯

先序遍歷

先序遍歷是以優(yōu)先于后代節(jié)點(diǎn)的順序訪問每個節(jié)點(diǎn)的。先序遍歷的一種應(yīng)用是打印一個結(jié)構(gòu)化的文檔。

先序遍歷邏輯

后序遍歷

后序遍歷是先訪問節(jié)點(diǎn)的后代節(jié)點(diǎn),再訪問節(jié)點(diǎn)本身。后續(xù)遍歷的一種應(yīng)用是計算一個目錄和它的子目錄中所有文件所占空間大小。

后序遍歷邏輯
打印節(jié)點(diǎn)
測試
測試結(jié)果

搜索樹中的值

(1)最小值

搜索樹中最小值

(2)最大值

搜索樹中最大值

(3)搜索特定的值

搜索樹中特定的值
測試搜索樹中值
測試結(jié)果

移除一個節(jié)點(diǎn)

(1)移除一個葉子結(jié)點(diǎn)

(2)移除有一個左或右子節(jié)點(diǎn)的節(jié)點(diǎn)

(3)移除有兩個子節(jié)點(diǎn)的節(jié)點(diǎn)

remove()
removeNode()
查找節(jié)點(diǎn)
移除節(jié)點(diǎn)測試結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容