資料結構 二叉排序樹BST初探

2021-07-22 10:56:28 字數 4177 閱讀 9959

首先給出二叉排序樹(binary sort tree)的定義:

一棵二叉排序樹或者是一棵空樹或者滿足以下條件:

(1)若它的左子樹不為空,則左子樹所有節點的值均小於根的值

(2)若它的右子樹不為空,則右子樹所有節點的值均大於根的值

(3)左右子樹本身又分別是二叉排序樹

如下圖就是乙個二叉排序樹:(繪畫水平真的就這樣了,不要在意這些細節)

由二叉排序樹的定義可以看出來,其實二叉排序樹可以看做是乙個有序表,對每乙個結點來說它的左子樹比根小,右子樹比根大。從小到大的順序是左根右,是不是和中序遍歷很像,對二叉排序樹的中序遍歷就是從小到大的排序,所以可以把它看成是乙個有序表。

為了在儲存這樣的二叉樹,使用的結構體如下:

typedef

struct node

bstree;

其中key就是二叉樹結點的值

*lchild, *rchild分別指向左孩子和右孩子

我們可以想得到,我們需要的是排序二叉樹根結點的指標,和我們需要插入的值,所以就將這兩個值作為函式的引數。

其次,我們需要根據根結點的指標,找到合適的插入位置,然後建立乙個結點p,結點p的值就是傳進來要新增的引數,結點p的左右孩子都為null。然後把它插入到這個位置上去。

具體程式如下:

//二叉排序樹插入元素

void insert_bstree(bstree *t, int k)

else

else}}

//如果需要插入

if (!end)

else }}

有了插入函式之後,就根據結點的個數進行插入就可以了。建立如下:
//建立二叉排序樹

void create_bdtree(bstree *t)

printf("建立完成\n");

}

二叉樹的乙個重要功能就是查詢,因為它的性質,它的查詢就好像是折半查詢一樣,每次可以根據大小的比較來縮小查詢的範圍。

具體的程式如下:

//查詢二叉排序樹的節點

bstree* search_bstree(bstree *t, int k)

else}}

return

null; //沒有找到

}

因為二叉排序樹是動態查詢,它相比於折半查詢的好處就是它可以很方便的刪除乙個結點。

刪除結點時,由於結點的不同位置有不同的刪除方法,所以刪除的難度相比於以上的運算都要來的複雜一些。具體分為以下四種情況:

(1)刪除的結點是葉子結點

這種情況很簡單,可以直接刪除就好了

(2)刪除的結點只有左子樹

用該右子樹的根取代待刪結點的位置

(3)刪除的結點只有右子樹

用該左子樹的根取代待刪結點的位置

(4)刪除的結點既有右子樹又有左子樹

需要用待刪結點在二叉排序樹中序遍歷中直接後繼結點來取代該待刪結點,然後直接後繼結點在按照以上三中情況處理。

在這裡說明一下28號結點,首先這個結點不會有左孩子,如果有,他就不會是根結點的中序遍歷後繼了,而是他的左孩子是。

所以28結點只有兩種情況:沒有右孩子、有右孩子。

對於沒有右孩子(如圖),就執**況1,將33結點的左孩子置空。

如果有右孩子,執**況2,用該結點的右子樹的根代替該結點。

刪除程式如下:

//刪除二叉排序樹節點

void delete_bstree(bstree *t, int k)

else

if (temp->key < k)

else

if (temp->key > k)

}if (temp ==

null)

else

else

}else

if (temp->lchild ==

null)

else

}else

if (temp->rchild ==

null)

else

}else

temp->key = next->key;

if (parent

->lchild == next)

else}}

}

最後我們使用中序遍歷一下該樹:

//輸出二叉排序樹

* 測試二叉排序樹

*/#include

#include

typedef struct node

bstree;

//二叉排序樹插入元素

void insert_bstree(bstree *t, int k)

else

else}}

//如果需要插入

if (!end)

else

}}//建立二叉排序樹

void create_bdtree(bstree *t)

printf("建立完成\n");

}//查詢二叉排序樹的節點

bstree* search_bstree(bstree *t, int k)

else}}

return

null;

}//刪除二叉排序樹節點

void delete_bstree(bstree *t, int k)

else

if (temp->key < k)

else

if (temp->key > k)

}if (temp ==

null)

else

else

}else

if (temp->lchild ==

null)

else

}else

if (temp->rchild ==

null)

else

}else

temp->key = next->key;

if (parent

->lchild == next)

else}}

}//輸出二叉排序樹

void showdata_bstree(bstree *t)

}int main()

else

else

if (result->rchild)

else

}printf("請輸入需要刪除的值:");

scanf("%d", &n);

delete_bstree(t, n);

printf("\n二叉排序樹中序遍歷如下:\n");

showdata_bstree(t);

printf("\n\n");

getchar();

getchar();

return

0;}

資料結構 二叉排序樹(BST)

基本介紹 示例 public class binarysorttreedemo int arr binarysorttree binarysorttree newbinarysorttree for int item arr binarysorttree.infixorder node node b...

資料結構與演算法 二叉排序樹 BST

二叉排序樹 bst binary sort search tree 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明 如果有相同的值,可以將該節點放在左子節點或右子節點。比如針對資料 7,3,10,12,5,1,9 對應的二叉排序樹為 二叉...

資料結構課設 BST二叉排序樹

程式設計實現二叉排序樹的建立 插入 刪除和查詢 對於給定的這組數在二叉排序樹上進行查詢,給出兩種情況下的查詢成功和不成功時的asl bst include using namespace std const int maxn 1e5 typedef struct node bsnode,bstree...