高效,不僅可以查詢資料;還可以高效的插入,刪除資料-動態維護資料。二叉搜尋樹可以不用是完全的二叉搜尋樹。下面這個也是二叉搜尋樹:還可以很方便的回答很多資料之間的關係問題:
由於二叉搜尋樹可以不是完全的二叉樹,所以用陣列表示不方便,我們採用的是用 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 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...