二叉查詢樹BST

2021-08-27 16:15:34 字數 1688 閱讀 7576

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,指向當前二叉樹的根節點...