二叉搜索树
2016-07-23 本文已影响8人
科学旅行者
二叉树:
树中所有节点的儿子个数都不超过2.
二叉搜索树特点:
所有的节点,都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大。
二叉搜索树的基本操作:
定义结构体变量:
#include <iostream>
using namespace std;
struct node {
int val;//节点的值;
node *lch;//左节点;
node *rch;//右节点;
};
二叉搜索树的建立:
node *creat(node *p,int num) {//先判断值是否存在,再创建节点;
if (p == nullptr) {
node *q = new node;
q -> val = num;
q -> lch = q -> rch = nullptr;
return q;
}
else {
if (num < p -> val) {//建立左子树:
p -> lch = creat(p -> lch,num);
}
else {//建立右子树;
p -> rch = creat(p -> rch,num);
}
return p;
}
}
先序遍历:先根再左再右。
void provisit(node *p) {
if (p) {
cout << p -> val << " ";
provisit(p -> lch);
provisit(p -> rch);
}
}
中序遍历:先左再根再右。
void midvisit(node *p) {
if (p) {
midvisit(p -> lch);
cout << p -> val << " ";
midvisit(p -> rch);
}
}
后序遍历:先左再右再根。
void nextvisit(node *p) {
if (p) {
nextvisit(p -> lch);
nextvisit(p -> rch);
cout << p -> val << " ";
}
}
查询某值:
bool find(node *p,int num) {
if (p == nullptr) return false;//表明在当前子树中未找到此值;
else if (p -> val == num) return true;//找到了;
else if (num < p -> val) return find(p -> lch,num);//值比当前根的值小;
else return find(p -> rch,num);//值比当前根的值大;
}
删除某值:
需要删除的节点没有左儿子,那么就把右儿子提上去。
需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
以上两种情况都不满足的话,就把左儿子的子孙中最大的节点提到需要删除的节点上。
node *remove(node *p,int num) {
if (p == nullptr) return nullptr;
else if (num < p -> val) p -> lch = remove(p -> lch,num);
else if (num > p -> val) p -> rch = remove(p -> rch,num);
else if (p -> lch == nullptr) {
node *q = p -> rch;
delete p;
return q;
}
else if (p -> lch -> rch == nullptr) {
node *q = p -> lch;
q -> rch = p -> rch;
delete p;
return q;
}
else {
node *q;
for (q = p -> lch;q -> rch -> rch != nullptr;q = q -> rch);
node *r = q -> rch;
q -> rch = r -> lch;
r -> lch = p -> lch;
r -> rch = p -> rch;
delete p;
return r;
}
return p;
}//注意节点的连接;
测试:
int main() {
int num;
int t = 10;
node *root = nullptr;
while (t--) {
cin >> num;
root = creat(root,num);
}
provisit(root);
cout << endl;
midvisit(root);
cout << endl;
nextvisit(root);
cout << endl;
int num1;
cout << "find ?????: ";
cin >> num1;
if (find(root,num1)) cout << "find it" << endl;
else cout << "not find it" << endl;
cin >> num1;
root = remove(root,num1);
provisit(root);
return 0;
}
如果有什么问题,欢迎批评指正。