这惨绝人寰的日志排版。
二叉搜索树:能够高效进行如下操作的数据结构:
1.插入数值。
2.删除数值。
3.查询数值。
满足左小右大。
二叉搜索树如果遇到了极端数据情况,会大大降低自己的效率。
平衡二叉树就是二叉搜索树的改进,巧妙地通过旋转操作来保持树的平衡。以下的代码没有实现平衡二叉树的功能,因为C++的STL库里有set容器,set是像前面所说的一样使用二叉搜索树维护集合的容器。
二叉搜索树最需要注意的是它的 删除 操作:
1.需要删除的节点没有左儿子,那么就把右儿子提上去。
2.需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
3。以上两种情况都不满足的话,就把做儿子的子孙中最大的节点提到需要删除的节点上。
二叉搜索树最需要注意的是它的 删除 操作:
1.需要删除的节点没有左儿子,那么就把右儿子提上去。
2.需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
3。以上两种情况都不满足的话,就把做儿子的子孙中最大的节点提到需要删除的节点上。
#include<iostream>
using namespace std;
//二叉搜索树
struct node {
int val;
node* lch, * rch;
};
//插入数值x
node* insert(node* p, int x)
{
if (p == NULL) {
node* q = new node;
q->val = x;
q->lch = q->rch = NULL;
return q;
}
else {
if (x < p->val)
p->lch = insert(p->lch, x);
else p->rch = insert(p->rch, x);
return p;
}
}
//查找数值x
bool find(node* p, int x)
{
if (p == NULL)
return false;
else if (x == p->val)
return true;
else if (x < p->val)
return find(p->lch, x);
else
return find(p->rch, x);
}
//删除数值x
node * remove(node * p, int x) {
if (p == NULL)
return NULL;
else if (x < p->val)
p->lch = remove(p->lch, x);
else if (x > p->val)
p->rch = remove(p->rch, x);
else if (p->lch == NULL)
{
node* q = p->rch;
delete p;
return q;
}
else if (p->lch->rch == NULL)
{
node* q = p->lch;
q->rch = p->rch;
delete p;
return q;
}
else {
node* q;
for (q = p->lch; q->rch->rch != NULL; 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;
}
//先序遍历。
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 << " ";
}
}
//测试
int main()
{
int t = 10, num;
node* root = nullptr;
while (t--) {
cin >> num;
root = insert(root, num);
}
provisit(root);
cout << endl;
midvisit(root);
cout << endl;
nextvisit(root);
cout << endl;
if (find(root, 1)) cout << "find it" << endl;
else cout << "not find it" << endl;
if (find(root, 11)) cout << "find it" << endl;
else cout << "not find it" << endl;
root = remove(root, 1);
provisit(root);
cout << endl;
return 0;
}