演算法 二叉搜尋樹 BST

2021-08-19 13:50:13 字數 3429 閱讀 1375

高效,不僅可以查詢資料;還可以高效的插入,刪除資料-動態維護資料。

還可以很方便的回答很多資料之間的關係問題:

二叉搜尋樹可以不用是完全的二叉搜尋樹。下面這個也是二叉搜尋樹:

由於二叉搜尋樹可以不是完全的二叉樹,所以用陣列表示不方便,我們採用的是用 node 節點表示。

插入乙個新節點,先比較該元素是否和根節點元素相同,如果相同,更新該節點的值,如果比根節點元素值小,則以構建左孩子節點,並返回該節點,否則構建右孩子節點,並返回值。

public

void

insert(key key, value value)

// 向以node為根的二分搜尋樹中, 插入節點(key, value), 使用遞迴演算法

// 返回插入新節點後的二分搜尋樹的根

private node insert(node node, key key, value value)

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

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

return node;

}

先和根節點比較,如果相等則返回,如果比根節點小,與該節點左孩子比較,比根節點大,則與右孩子比較。如果左或右孩子都為空的話,則查詢失敗。

// 檢視二分搜尋樹中是否存在鍵key

public

boolean

contain(key key)

// 在二分搜尋樹中搜尋鍵key所對應的值。如果這個值不存在, 則返回null

public value search(key key)

// 檢視以node為根的二分搜尋樹中是否包含鍵值為key的節點, 使用遞迴演算法

private

boolean

contain(node node, key key)

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

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

}// 在以node為根的二分搜尋樹中查詢key所對應的value, 遞迴演算法

// 若value不存在, 則返回null

private value search(node node, key key)

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

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

}

3.1 前序遍歷

// 二分搜尋樹的前序遍歷

public

void

preorder()

private

void

preorder(node node)

}

3.2 中序遍歷

// 二分搜尋樹的中序遍歷

public

void

inorder()

private

void

inorder(node node)

}

3.3 後序遍歷

// 二分搜尋樹的後序遍歷

public

void

postorder()

private

void

postorder(node node)

}

3.4 層序遍歷

// 二分搜尋樹的層序遍歷

public

void

levelorder()

}

二叉搜尋樹中的最小值就是一直尋找根節點的左孩子,直到該左孩子為空,則該節點就是最小值;最大值就是一直尋找根節點的右孩子,直到該右孩子為空,該節點就是最大值。

// 尋找二分搜尋樹的最小的鍵值

public key minimum()

private node minimum(node node)

return minimum(node.left);

}// 尋找二分搜尋樹的最大的鍵值

public key maximum()

private node maximum(node node)

return maximum(node.right);

}

5.1 刪除最小值和最大值

找到最小值,如果該最小值的右孩子不為空的話,把右孩子移上來;找到最大值,如果該節點的左孩子不空的話,則把左孩子移上來。

// 從二分搜尋樹中刪除最小值所在節點

public

void

removemin()

}private node removemin(node node)

node.left=removemin(node.left);

return node;

}// 從二分搜尋樹中刪除最大值所在節點

public

void

removemax()

}private node removemax(node node)

node.right=removemax(node.right);

return node;

}

5.2 刪除任意節點的值

如果要刪除的節點只有左孩子,直接把左孩子移上去;如果要刪除的節點只有右孩子,直接把右孩子移上去,如果要刪除的節點既有左孩子又有右孩子,則選擇右孩子中最小的,或者做孩子中最大的。

// 從二分搜尋樹中刪除鍵值為key的節點

public

void

remove(key key)

// 刪除掉以node為根的二分搜尋樹中鍵值為key的節點, 遞迴演算法

// 返回刪除節點後新的二分搜尋樹的根

private node remove(node node, key key)

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

if (key.compareto(key)>0)else

// 待刪除節點右子樹為空的情況

if (node.right==null)

node successor=new node(minimum(node.right));

successor.right=removemin(node.right);

successor.left=node.left;

node.left=node.right=null;

count--;

return successor;}}

二叉搜尋樹BST

在二叉搜尋樹b中查詢x的過程為 1.若b是空樹,則搜尋失敗,否則 2.若x等於b的根結點的資料域之值,則查詢成功 否則 3.若x小於b的根結點的資料域之值,則搜尋左子樹 否則 4.查詢右子樹 指標parent指向proot的父節點,其初始呼叫值為null 若查詢成功,指標ptarget指向目標節點,...

二叉搜尋樹(BST)

二叉搜尋樹 bst bst 或者是一棵空樹,或者對於任何乙個結點,設其值為k,則該結點的左子樹的值小於k,右結點的值大於k。二叉搜尋樹按照中根遍歷將各個結點列印,將得到按照大到小的順序排列。bsg示意圖 二叉搜尋樹的效率在於檢索,將演算法複雜度從2 k減少到log n 檢索方式 從根結點開始,如果等...

BST二叉搜尋樹

深入學習理解bst include using namespace std typedef struct bitnodebitnode,bitree 二叉樹的插入操作 void insert bitnode root,int x 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...