二叉搜尋樹的插入 刪除 查詢

2022-05-03 11:48:21 字數 2587 閱讀 6747

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

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

(3)左、右子樹也分別為二叉排序樹

(4)沒有鍵值相等的節點

插入的資料之後要滿足二叉樹的性質1和2,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面

所以插入分兩個步驟:

1、確定插入位置是在那個葉子節點下面

2、新建乙個節點,讓葉子節點指向新建的節點

node* insert(node* root,int

x)

if(xdata)

else

root->right=insert(root->right,x);

return root;//

插入的時候是遞迴,所以最後會返回根節點

}

從根節點不斷往下找就行

bool search(node * root,int

x)

刪除的時候比較複雜,因為刪除的節點不一定是在葉子節點上,有可能在其它位置,刪除乙個節點後還要維持二叉樹的完整和樹的性質

如何維持二叉查詢樹的完整和性質呢?

1、先說如何維持樹的完整性:

找到被刪除節點的位置之後,我們不直接把這個節點刪除,而是從被刪除節點的子樹中找到乙個後繼節點,用後繼節點的值去替換被刪除的節點,

然後刪除後繼節點(這裡有乙個遞迴,會遞迴到子節點,最後變成刪除葉子節點,刪除葉子節點就不會影響樹的完整)

2、如何維持二叉查詢樹的性質,也就是如何找後繼節點(這個性質是:左節點比根節點小,右節點比根節點大)

從右子樹中找乙個最小值,這個最小值就是後繼節點

舉個例子解釋一下:

如果我要刪除值為3的節點,從節點3的右子樹中找乙個最小值是4,4比右子樹中的所有值都大,同時比左子樹中所有值都小,所以可以讓4去替代3成為根節點

**

//

在右子樹中查詢後繼節點(右子樹中的最小值)

node* findmin(node *root)

從左節點中找乙個最大值成為後繼節點,原理同上

**

//

在左子樹中查詢後繼節點(左子樹中的最大值)

node* findmax(node *root)

從右子樹中找乙個最小值成為後繼節點

刪除的**

//

刪除值為x的節點

node* delet(node* root,int

x)

else

else} }

return root;//

返回根節點

}

樹的遍歷有三種方式:前序、後序、中序

void inorder(node* root)//

以中序序列輸出

void preorder(node* root)//

以先序序列輸出

void houorder(node* root)//

後序序列輸出

#include#include

#include

using

namespace

std;

struct

node;//

查詢值為x的節點是否在二叉樹

bool search(node * root,int

x)//

向樹中插入乙個節點

node* insert(node* root,int

x)

if(xdata)

else

root->right=insert(root->right,x);

return root;//

插入的時候是遞迴,所以最後會返回根節點}//

在左子樹中查詢後繼節點(左子樹中的最大值)

node* findmax(node *root)

//在右子樹中查詢後繼節點(右子樹中的最小值)

node* findmin(node *root)

//刪除值為x的節點

node* delet(node* root,int

x)

else

else} }

return root;//

返回根節點

}void printbstree(node *root)//

前序遍歷輸出

}void inorder(node* root)//

以中序序列輸出

void preorder(node* root)//

以先序序列輸出

void houorder(node* root)//

後序序列輸出

intmain()

preorder(root);

cout

<

delet(root,4);

preorder(root);

cout

<

return0;

}

二叉搜尋樹的插入,查詢,刪除

include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...

二叉搜尋樹的查詢 插入 刪除

coding utf 8 time 2020 9 23 15 56 author julyli file bst.py class bitreenode def init self,data self.data data self.lchild none self.rchild none self....

二叉搜尋樹的查詢 刪除 插入

1 include2 3using namespace std 45 二叉搜尋樹 6 typedef struct binode 7binode bitree 這裡面的bitree前面有乙個星星,表示這種結構的指標型別 1314 sousuo 15 這裡的 t代表的是二叉排序樹,key表示的是要查詢...