您的位置:首页 > 理论基础 > 数据结构算法

数据结构-二叉搜索树

2016-04-14 16:40 344 查看
二叉搜索树的所有节点都满足左子树上的所有节点都比自己小,而右子树上的所有节点都比自己大这一条件。

当删除某个节点时,需要根据下面几种情况分别进行处理:

需要删除的节点没有左儿子,那么就把右儿子提上去。

需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。

以上两种情况都不满足的话,就把左儿子的子孙(左子树)中最大的节点提到需要删除的节点上。

struct node
{
int val;
node *lch, *rch;
};

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;
}
}

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);
}

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: