二叉樹和二叉查詢樹

2021-07-10 22:13:50 字數 3150 閱讀 6726

以前學過二叉樹,是用c語言實現的,當時雖然聽懂了,但是自己用c語言實現,還是有點困難的,現在學習了前端,發現二叉樹還是很簡單的。今天就來說一說。

二叉樹是一種常用的資料結構,樹也是一種非線性的資料結構,以分層的方式儲存資料,樹被用來儲存具有層級關係的資料,比如系統中的檔案,還有前端經常說到的dom樹。現在我們研究的是一種特殊的樹。

function

node

(data, left, right)

這裡的show是用來顯示儲存在節點裡面的資料

function

show

()

有了節點之後,我們需要有一顆二叉查詢樹bst(binary search tree)

function

bst()

/*插入資料的演算法是

我們先新建乙個節點,把當前的資料放到這個節點中去

我們先判讀當前的樹是否為空,如果為空,就把該節點作為根節點

如果不為空,就需要遍歷bst了,找到要插入的位置,用乙個變數儲存當前的節點,一層層的進行遍歷

進入bst後,我們要決定將節點放置到哪個位置,找到正確的插入點,就後跳出迴圈

演算法如下

(1)設根節點為當前節點

(2)如果待插入節點儲存的資料小於當前節點,就設新的當前節點為原節點的左節點,否則,執行第四步

(3)如果當前節點的左節點為null,就將新的節點插入這個位置,退出迴圈,反之繼續執行下一次迴圈

(4)設新的節點為原節點的右節點

(5)如果當前節點的右節點為null,就將新的節點插入到這個位置,退出迴圈,反之,進行下一次迴圈

*/function

insert

(data) else

} else }}

}

現在二叉樹初步成型,我們需要有能力遍歷bst,這樣就可以按照不同的順序,比如按照數字的大小先後,顯示節點上的資料

有三種遍歷bst的方式,中序、先序和後序。中序遍歷按照節點上的鍵值,以公升序訪問bst上的所有節點。

先序遍歷先訪問根節點,然後以同樣的方式訪問左子樹和右子樹,

後序遍歷先訪問葉子節點,從左子樹到右子樹,再到根節點。

中序遍歷使用遞迴的方式最容易實現

這裡的inorder是中序遍歷的意思。

先訪問左子樹,再訪問根節點,最後訪問右子樹,倘若不理解遞迴,就先看乙個例子,

if (number == 1) else

}print(factorial(5));

畫一幅圖進行理解

5

*factorial(4)5*4

*factorial(3)5*4

*3*factorial(2)5*4

*3*2*15

*4*3*25

*4*6

5*24

120

看了這個過程就很好理解了。

function

inorder

(node)

}

function

preorder

(node)

}

function

postorder

(node)

}

(1)查詢給定值

(2)查詢最小值

(3)查詢最大值

查詢最大值和 最小值非常簡單,因為較小的值總是在左子節點上,在bst上查詢最小值,只需要遍歷左子樹,直到找到最後乙個節點

getmin()方法查詢bst上的最小值,

function

getmin

() return current.data;

}

function

getmax

() return current.data;

}

查詢給定值

function find(data) 

else

if (data

< current.

data)

else

}return

null;

}

從bst中刪除節點的第一步是判斷當前節點是否包含待刪除資料,如果包含,則刪除該結點,如果不包含,則比較當前節點上的資料和待刪除的資料。如果待刪除的資料小於當前節點的資料,則移至當前節點的左子節點進行比較,如果刪除的資料大於當前節點上的資料,則移至當前節點的右子節點繼續比較。

如果待刪除節點是葉子節點,那麼只需要將從父節點指向他的鏈結指向null,

如果待刪除節點只包含乙個子節點,那麼原本指向他的節點就得做些調整,使其執行他的子節點。

如果待刪除節點包含兩個子節點,正確的做法有兩種:要麼查詢待刪除節點左子樹上的最大值,要麼查詢其右子樹上的最小值。這裡我們選擇後一種方式。

我們需要乙個查詢子樹最小值的方法,後面會用他找到的最小值建立乙個臨時節點,將臨時節點上的值賦值到待刪除節點,然後在刪除臨時節點。

function remove (data) 

function removenode(node, data)

if (data

== node.

data)

//沒有左子節點的節點

if (node.left ==

null)

//沒有右子節點的節點

if (node.right ==

null)

//有兩個子節點的節點

var tempnode = getsmallest(node.right);

node.

data

= tempnode.

data;

node.right = removenode(node.right, tempnode.

data);

return node;

}else

if(data

< node.

data)

else

else

}

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...

樹(樹,二叉樹,二叉查詢樹)

1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...