樹(tree)是n(n≥0)個結點的有限集。在任意一棵非空樹中:(1)有且僅有乙個特定的被稱為根(root)的結點;(2)當n>1時,其餘結點可分為m(m>0)個互不相交的有限集t1,t2,…,tm,其中每乙個集合本身又是一棵樹,並且稱為根的子樹(subtree)。
度:結點擁有的子樹數稱為結點的度(degree)。度為0的結點稱為葉子(leaf)或終端結點。度不為0的結點稱為非終端結點或分支結點。樹的度是樹內各結點的度的最大值。
孩子及雙親:結點的子樹的根稱為該結點的孩子(child),相應地,該結點稱為孩子的雙親(parent)。
層次「結點的層次(level)是從根結點開始計算起,根為第一層,根的孩子為第二層,依次類推。樹中結點的最大層次稱為樹的深度(depth)或高度。
如果將樹中結點的各子樹看成從左至右是有次序的(即不能互換),則稱該樹為有序樹,否則稱為無序樹。
二叉樹(binary tree)的特點是每個結點至多具有兩棵子樹(即在二叉樹中不存在度大於2的結點),並且子樹之間有左右之分。
二叉樹的性質:
(1)、在二叉樹的第i層上至多有2
i-1個結點(i≥1)。
(2)、深度為k的二叉樹至多有2
k-1個結點(k≥1)。
(3)、對任何一棵二叉樹,如果其葉子結點數為n0,度為2的結點數為n2,則n0=n2+1。
一棵深度為k且有2^k-1個結點的二叉樹稱為滿二叉樹。
可以對滿二叉樹的結點進行連續編號,約定編號從根結點起,自上而下,自左至右,則由此可引出完全二叉樹的定義。深度為k且有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1到n的結點一一對應時,稱之為完全二叉樹。
(4)、具有n個結點的完全二叉樹的深度為不大於log
2n的最大整數加1。
(5)、如果對一棵有n個結點的完全二叉樹的結點按層序編號(從第1層到最後一層,每層從左到右),則對任一結點i(1≤i≤n),有
a、如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是結點x(其中x是不大於i/2的最大整數)。
b、如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子是結點2i。
c、如果2i+1>n,則結點i無右孩子;否則其右孩子是結點2i+1。
查詢:
在二叉查詢樹中查詢x的過程如下:
1、若二叉樹是空樹,則查詢失敗。
2、若x等於根結點的資料,則查詢成功,否則。
3、若x小於根結點的資料,則遞迴查詢其左子樹,否則。
4、遞迴查詢其右子樹。
/**
* 二叉查詢樹的查詢
* @param node
* @param x
*/public treenode find(treenode node,int x)
/** * 查詢最小值(遞迴實現)
* 一直查詢左子樹,最後乙個節點即為最小值
* @param node
*/public treenode findmin(treenode node)
}/**
* 查詢最大值(迴圈實現)
* 一直查詢右子樹
* @param node
*/public treenode findmax(treenode node)
插入:
二叉樹查詢樹b插入操作x的過程如下:
1、若b是空樹,則直接將插入的結點作為根結點插入。
2、x等於b的根結點的資料的值,則直接返回,否則。
3、若x小於b的根結點的資料的值,則將x要插入的結點的位置改變為b的左子樹,否則。
4、將x要出入的結點的位置改變為b的右子樹。
/**
* 新增
* @param x
* @param root
* @return
*/public treenode insert(int x,treenode root)
else if(xroot.val) //...
root.right = insert(x, root.right);
return root;
}
刪除:
對於二叉查詢樹的刪除操作(這裡根據值刪除,而非結點)分三種情況:
不過在此之前,我們應該確保根據給定的值找到了要刪除的結點,如若沒找到該結點
不會執行刪除操作!
下面三種情況假設已經找到了要刪除的結點。
1、如果結點為葉子結點(沒有左、右子樹),此時刪除該結點不會玻化樹的結構
直接刪除即可,並修改其父結點指向它的引用為null.如下圖:
2、如果其結點只包含左子樹,或者右子樹的話,此時直接刪除該結點,並將其左子樹
或者右子樹設定為其父結點的左子樹或者右子樹即可,此操作不會破壞樹結構。
3、 當結點的左右子樹都不空的時候,一般的刪除策略是用其右子樹的最小資料
(容易找到)代替要刪除的結點資料並遞迴刪除該結點(此時為null),因為
右子樹的最小結點不可能有左孩子,所以第二次刪除較為容易。
z的左子樹和右子樹均不空。找到z的後繼y,因為y一定沒有左子樹,所以可以刪除y,
並讓y的父親節點成為y的右子樹的父親節點,並用y的值代替z的值.如圖:
滿二叉樹 完全二叉樹 二叉樹的性質
單是每個結點都存在左右子樹不能算是滿二叉樹,還必須要所有的葉子都在同一層上,這就做到了整棵樹的平衡,因此滿二叉樹的特點有 1.葉子只能出現在最下一層,出現在其他層就不可能達成平衡 2.非葉子結點的度一定是2 3.在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多 對一棵具有n結點的二叉樹按層序...
二叉樹性質
1.在二叉樹的第i層上最多有2i 1 個節點 i 1 用歸納法證明 歸納基 i 1 層時,只有乙個根結點,2i 1 20 1 歸納假設 假設i k時,命題成立 歸納證明 二叉樹上每個結點至多有兩棵子樹,則 第 k 1 層的結點數 最多為2k 1 x 2 2k 1 1 2.二叉樹中如果深度為k,那麼最...
二叉樹性質
二叉樹有以下幾個性質 todo 上標和下標 性質1 二叉樹第i層上的結點數目最多為2 i 1 性質2 深度為k的二叉樹至多有2 1個結點 k 1 性質3 包含n個結點的二叉樹的高度至少為log2 n 1 性質4 在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0 n2 1。2....