binary search tree
· bst是一棵資料域有序的樹,其左子樹上的所有結點的資料域均小於或等於根結點的資料域,右子樹上所有結點的資料域均大於根結點的資料域,即其中序遍歷是有序的。
二叉查詢樹的基本操作
1.查詢操作
和普通二叉樹的查詢不同,二叉查詢樹可根據資料域的比較對左右子樹選擇遞迴
void search(node* root,int x)
if(x==root->data)else
if(xdata)else search(root->rchild);
}
2.插入操作
查詢失敗的地方一定是結點需要插入的地方,在上述**中修改:root==null條件下建立以帶插入值為資料域的新結點。
注意:因為要插入結點而非單純讀取資料,所以要用引用。
void insert(node* &root,int x)
if(x==root->data) return;
else
if(xdata)else insert(root->rchild,x);
}
3.二叉查詢樹的建立
即為插入n個結點的過程
注:即便是同一組數字,插入他們的順序不同,最後生成的二叉查詢樹也不同。
node* create(int data,int n)
4.二叉查詢樹的刪除
· bst中比結點權值小的最大結點稱為該結點的前驅,前驅是該結點左子樹中的最右結點
· bst中比結點權值大的最小結點稱為該結點的後繼,後繼是該結點右子樹中的最左結點
//尋找以root為根結點的樹中的最大權值結點
node* findmax(node* root)
//尋找以root為根結點的樹中的最小權值結點
node* findmin(node* root)
刪除操作的基本思路:
1)如果當前結點root值為空,則不存在權值為給定權值的結點,直接返回
2)如果當前結點root的權值恰為給定權值x,則進入刪除處理:
a)如果當前結點root不存在左右子樹,說明是葉子節點,直接刪除
b)如果當前結點root存在左子樹,那麼在左子樹中尋找前驅pre,然後讓pre的資料覆蓋root,接著在左子樹中刪除結點pre
c)如果當前結點root存在右子樹,那麼在右子樹中尋找後繼next,然後讓next的資料覆蓋root,接著在右子樹中刪除next
3)如果當前root的權值大於給定x,則在左子樹中遞迴刪除權值為x的結點
4)如果當前root的權值小於給定x,則在右子樹中遞迴刪除權值為x的結點
//刪除以root為根結點的樹中權值為x的結點
void deletenode(node* &root,int x)else
if(root->lchild!=null)else
}else
if(root->data>x)else deletenode(root->rchild,x);
}
注意:總是優先刪除前驅(或者後繼)容易導致樹的左右子樹高度極不平衡,使得二叉樹退化成一條鏈。兩種解決辦法:每次交替刪除前驅或後繼;記錄子樹高度,總是優先在高度較高的一棵子樹裡刪除結點。
【筆記,摘自胡凡《演算法筆記》】
二叉查詢樹 BST
當所有的靜態查詢結構新增和刪除乙個資料的時候,整個結構都需要重建。這對於常常需要在查詢過程中動態改變資料而言,是災難性的。因此人們就必須去尋找高效的動態查詢結構,我們在這討論乙個非常常用的動態查詢樹 二叉查詢樹。二叉查詢樹的特點 下面的圖就是兩棵二叉查詢樹,我們可以總結一下他的特點 1 若它的左子樹...
二叉查詢樹(BST)
二叉查詢樹,也稱為二叉排序樹,二叉搜尋樹。二叉查詢樹結合了鍊錶插入的靈活性和有序陣列查詢 二分查詢 的高效性。用二叉查詢樹實現有序符號表的api。public class bst,value 有序符號表的相關方法 public intsize private intsize node x publi...
二叉查詢樹BST
樹由node物件組成,每個物件有一對鍵值 兩條鏈結和乙個節點計數器n。每個node物件都是一棵含有n個節點的子樹的根節點,它的左鏈結指向一棵由小於該節點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該節點的所有鍵組成的二叉查詢樹。在bst類中,還應定義乙個node物件root,指向當前二叉樹的根節點...