二叉查詢樹 Binary Search Tree

2021-08-03 22:43:48 字數 3637 閱讀 1456

本帖部分文字和來自於

但所有**均為原創

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

二叉查詢樹相比於其他資料結構的優勢在於查詢、插入的時間複雜度較低,為o(log n)。二叉查詢樹是基礎性資料結構,用於構建更為抽象的資料結構,如集合、multiset、關聯陣列等。

如何新增元素到二叉查詢樹中呢?

首先定義二叉查詢樹類

public

class binarysearchtreenode

}

然後定義add方法

public binarysearchtreenode add(int

value, binarysearchtreenode node)else else

}

列印整個二叉查詢樹:

public void printbst(binarysearchtreenode node)

if(node.right != null)

}

最後我們執行下面的**進行測試:

int values = ;

binarysearchtreenode root = null;

for(int i=0; i

printbst(root);

以下是輸出內容:

node = 20, node.parent = null, left=15, right=25

node = 15, node.parent = 20, left=10, right=18

node = 10, node.parent = 15, left=null, right=12

node = 12, node.parent = 10, left=null, right=null

node = 18, node.parent = 15, left=null, right=null

node = 25, node.parent = 20, left=null, right=30

node = 30, node.parent = 25, left=null, right=null

生成二叉查詢樹的問題解決了,那麼如何查詢呢

- 若b是空樹,則搜尋失敗,否則:

- 若x等於b的根節點的資料域之值,則查詢成功;否則:

- 若x小於b的根節點的資料域之值,則搜尋左子樹;否則:

- 查詢右子樹。

public binarysearchtreenode search(binarysearchtreenode node, int

value)else

if (value

< node.value) else

}else

}

system.out.println(「search 18 = 」 + (search(root, 18)==null?」failure」:」success」));

system.out.println(「search 22 = 」 + (search(root, 22)==null?」failure」:」success」));

輸出結果:

search 18 = success

search 22 = failure

刪除是最複雜的,主要考慮兩種情況

單孩子的情況

這個比較簡單,如果刪除的節點有左孩子那就把左孩子頂上去,如果有右孩子就把右孩子頂上去,結束。

左右都有孩子的情況

首先可以這麼想象,如果我們要刪除乙個陣列的元素,那麼我們在刪除後會將其後面的乙個元素頂到被刪除的位置,如圖

那麼二叉樹操作同樣也是一樣,我們根據」中序遍歷「找到要刪除結點的後乙個結點,然後頂上去就行了,原理跟」陣列」一樣一樣的。

**如下:

public binarysearchtreenode delete(binarysearchtreenode node) else

if (node.parent.left != null && node.parent.left.value == node.value) else

if (node.parent.right != null && node.parent.right.value == node.value)

return node.parent;

} else

if (node.left != null && node.right != null) else else

if (node.parent.right != null && node.parent.right.value == node.value)

node = n;}}

return node;

}

以下是測試**:

system.out.println("it will delete 15");

binarysearchtreenode deletenode15 = search(root, 15);

if(deletenode15 != null && deletenode15.parent != null) else

printbst(root);

it will delete 15

delete 15 = success

node = 20, node.parent = null, left=18, right=25

node = 18, node.parent = 20, left=10, right=null

node = 10, node.parent = 18, left=null, right=12

node = 12, node.parent = 10, left=null, right=null

node = 25, node.parent = 20, left=null, right=30

node = 30, node.parent = 25, left=null, right=null

二叉樹 二叉查詢樹

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