二叉查詢樹

2021-09-11 21:28:15 字數 3752 閱讀 7507

二叉查詢樹(binary search tree),也稱有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:

若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

任意節點的左、右子樹也分別為二叉查詢樹。

沒有鍵值相等的節點(no duplicate nodes)。

如下圖,這個是普通的二叉樹:

在此基礎上,加上節點之間的大小關係,就是二叉查詢樹:

在實現中,我們需要定義乙個內部類node,它包含兩個分別指向左右節點的node,乙個用於排序的key,以及該節點包含的值value,還有乙個記錄該節點及所有子節點個數的值number。

public class binarysearchtreesymboltable: symboltableswhere tkey : icomparable, iequatable

public node right

public int number

public tkey key

public tvalue value

public node(tkey key, tvalue value, int number)

}...}

查詢查詢操作和二分查詢類似,將key和節點的key比較,如果小於,那麼就在left node節點查詢,如果大於,則在right node節點查詢,如果相等,直接返回value。

該方法實現有迭代和遞迴兩種。

遞迴的方式實現如下:

public override tvalue get(tkey key)

else if (key.compareto(node.key) < 0)

else

}return result;

}

迭代的如下

public tvalue get(tkey key)

private tvalue getvalue(node root, tkey key)

插入插入和查詢類似,首先查詢有沒有和key相同的,如果有,更新;如果沒有找到,那麼建立新的節點。並更新每個節點的number值,**實現如下:

最大最小值如下圖可以看出,二叉查詢樹的最大最小值是有規律的:

從圖中可以看出,二叉查詢樹中,最左和最右節點即為最小值和最大值,所以我們只需迭代呼叫即可。

public override tkey getmax()

maxitem = s.key;

return maxitem;

}public override tkey getmin()

minitem = s.key;

return minitem;

}

以下是遞迴的版本:

public tkey getmaxrecursive()

private tkey getmaxrecursive(node root)

public tkey getminrecursive()

private tkey getminrecursive(node root)

floor和ceiling查詢floor(key)的值就是所有<=key的最大值,相反查詢ceiling的值就是所有》=key的最小值,下圖是floor函式的查詢示意圖:

以查詢floor為例,我們首先將key和root元素比較,如果key比root的key小,則floor值一定在左子樹上;如果比root的key大,則有可能在右子樹上,當且僅當其右子樹有乙個節點的key值要小於等於該key;如果和root的key相等,則floor值就是key。根據以上分析,floor方法的**如下,ceiling方法的**類似,只需要把符號換一下即可:

public tkey floor(tkey key)

private node floor(node x, tkey key)

}

刪除刪除元素操作在二叉樹的操作中應該是比較複雜的。首先來看下比較簡單的刪除最大最小值得方法。

以刪除最小值為例,我們首先找到最小值,及最左邊左子樹為空的節點,然後返回其右子樹作為新的左子樹。操作示意圖如下:

現在來分析一般情況,假定我們要刪除指定key的某乙個節點。這個問題的難點在於:刪除最大最小值的操作,刪除的節點只有1個子節點或者沒有子節點,這樣比較簡單。但是如果刪除任意節點,就有可能出現刪除的節點有0個,1 個,2個子節點的情況,現在來逐一分析。

當刪除的節點沒有子節點時,直接將該父節點指向該節點的link設定為null。

當刪除的節點只有1個子節點時,將該自己點替換為要刪除的節點即可。

當刪除的節點有2個子節點時,問題就變複雜了。

假設我們刪除的節點t具有兩個子節點。因為t具有右子節點,所以我們需要找到其右子節點中的最小節點,替換t節點的位置。這裡有四個步驟:

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 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 ...