二分搜尋樹基本操作

2021-08-20 23:13:44 字數 4502 閱讀 6476

原:

查詢刪除等等。。。。

insert插入

find查詢

delete刪除

最大值最小值

前驅後繼successor  predecessor

上界下屆floor  ceil

某個元素的排名rank

尋找第k大元素 select

int search(int

*arr,int n,int key)

return -1;

}

int bisearch(int *arr,int n,int key)

else

if(arr[mid]>key)

else

}return -1;

}

struct node//建構函式

};

class bst//節點建構函式

};node *root; //root為根

int count; // count記錄的shi當前樹中擁有節點的個數

public:

bst() //bst樹的建構函式

};

node *insert(node *node,int key,int value)

if(node->key< key)

else

if(node->key>key)

else

if(node->key==key) // 因為允許重複key值的插入,所以有重複key值的時候要更新節點資訊

return node; //返回的就是這個數的根

}

void insert(int

key,int

value)

int search(node *node,int key)

else

if(node->key>key)

else

}return-1;

}

int search(int key)
if(node->left==null)
if(node->right==

null)

node* minimun(node *node)

return minimun(node->left);

}

node *s=

new node(minimun(node->right)); //用s複製該節點的右子樹的最小值的那個節點

count++;

s->right=removemin(node->right);//把右子樹那個最小值刪掉並且做s的右子樹

s->left=node->left;

delete node;

count--;

return s;

node(node *node)
node *remove(node *node,int key)

if(node->key==key)

if(node->right==

null)

// node->left!=null && node->right!=null 情況c

node *s=

new node(minimun(node->right)); //用s複製該節點的右子樹的最小值的那個節點

count++;

s->right=removemin(node->right);//把右子樹那個最小值刪掉並且做s的右子樹

s->left=node->left;

delete node;

count--;

return s;

}else

if(node->key>key)

else

}

void remove(int key)  // 簡單粗暴
#include

#include

<

queue

>

#include

using namespace std;

//template

class bst//建構函式

node(node *node)

};node *root;

int count;

public:

bst()

~bst()

int size()

bool isempty()

void insert(int key,int value)

void preorder()

void inorder()

void postorder()

int search(int key)

void leverorder()

bool contain(int key)

int getfrequency(int key)

int getmin()

int getmax()

void removemin()

}void removemax()

}void remove(int key)

private:

node *insert(node *node,int key,int value)

if(node->key< key)

else

if(node->key>key)

else

if(node->key==key)

return node;

}void preorder(node *node)

}void inorder(node *node)

}void postorder(node *node)

}void levelorder(node *node)

if(p->right!=

null)}}

int search(node *node,int key)

else

if(node->key>key)

else

}return-1;

}int getfrequency(node *node,int key)

else

if(node->key>key)

else

}return-1;

}bool contain(node *node,int key)

else

if(node->key>key) else

}return

false;

}void destroy(node *node)

}node* minimun(node *node)

return minimun(node->left);

}node* maxmun(node *node)

return maxmun(node->right);

}int getmin(node *node)

return getmin(node->left);

}int getmax(node *node)

return getmax(node->right);

}node *removemin(node *node)

else

}node *removemax(node *node)

else

}node *remove(node *node,int key)

if(node->key==key)

if(node->right==

null)

// node->left!=null && node->right!=null

node *s=

new node(minimun(node->right)); //用s複製該節點的右子樹的最小值的那個節點

count++;

s->right=removemin(node->right);//把右子樹那個最小值刪掉並且做s的右子樹

s->left=node->left;

delete node;

count--;

return s;

}else

if(node->key>key)

else

}};int main() ;

int n=10;

for(int i=0;i<7;i++){

// int key=rand()%n;

int key=a

[i];

int value=2*key;

bst.insert(key,value);

cout<

二分搜尋樹

1.二分搜尋樹 binary search tree 性質 a.二分搜尋樹是二叉樹 b.二分搜尋樹的每乙個節點的值 大於其左子樹的所有節點的值 小於其右子樹的所有節點的值 c.每一顆子樹也是二分搜尋樹 e.儲存的元素必須具有可比較性 二分搜尋樹的乙個缺點 2.二分搜尋樹的操作 a.二分搜尋樹新增新元...

二分搜尋樹

include include include include include using namespace std templateclass bst bst int size bool isempty 插入結點 void insert key key,value value 是否包含該鍵值的結...

二分搜尋樹

template class bst node root intcount public bst bst intsize bool isempty 插入新的節點 public void insert key key,value value private 向以node為根的二叉搜尋樹中,插入節點 k...