二叉排序树:根节点的值一定大于左子树的值,一定小于右子树的值。
二叉排序树的建立,添加,删除,查找
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<malloc.h>
#include<queue>
#include<vector>
using namespace std;
typedef struct node{
int data;
struct node* lchild;
struct node* rchild;
}node;
int search(node* p, int key)
{
if(p == NULL)
return 0;
else
{
if(p->data == key)
return 1;
else if(key < p->data)
return search(p->lchild, key);
else
return search(p->rchild, key);
}
}
int insert(node* &p, int key)
{
if(p == NULL)
{
p = (node*)malloc(sizeof(node));
p->lchild = p->rchild = NULL;
p->data = key;
return 1;
}
else
{
if(key == p->data)
return 0;
else if(key < p->data)
insert(p->lchild, key);
else
insert(p->rchild, key);
}
}
void create(node* &p, int key[], int n)
{
p = NULL;
for(int i = 0; i < n; i++)
insert(p, key[i]);
}
/*
关键字即 数值
1.p为叶子节点,直接删除即可。
2.p只有一个孩子,将该孩子指向自己的父节点
3.p有两个孩子
1.沿着p的左孩子一直向右走 ,走到该节点(r)没有右孩子为止(p点根节点的左子树最大关键字),
用r的关键字代替 p中的关键字,之后删除r节点
2. 沿着p的右孩子一直向左走 ,走到该节点(r)没有左孩子为止(p点根节点的右子树最小关键字),
用r的关键字代替 p中的关键字,之后删除r节点
*/
void det(node* &p)
{
node* q;
node* s;
if(p->rchild == NULL)//只是右子树非空则只需重接它的左子树
{
q = p;
p = p->lchild;
free(q);
}
else if(p->lchild == NULL)//只是左子树非空只需重接它的右子树
{
q = p;
p = p->rchild;
free(q);
}
else//左右子树均不空
{
q = p;
s = p->lchild;
while(s->rchild != NULL)//转左,然后向右走到尽头
{
q = s;
s = s->rchild;
}
p->data = s->data; //相当于r的关键字代换p的
if(q != p)
q->rchild = s->lchild;//重接*q右子树
else
q->lchild = s->lchild;//重接*q左子树
free(s);
}
}
int del(node* &p, int key)
{
if(p == NULL)
return 0;
else
{
if(key == p->data)
{
det(p);
return 1;
}
else if(key < p->data)
del(p->lchild, key);
else
del(p->rchild, key);
}
}
int main()
{
int a[15];
for(int i = 0; i < 10; i++)
a[i] = i;
node* root;
root = (node*)malloc(sizeof(node));
create(root, a, 10);
printf("查找结果:%d\n", search(root, 5));
printf("添加结果:%d\n", insert(root, 11));
printf("删除结果:%d\n", del(root, 10));
printf("删除结果:%d\n", del(root, 5));
return 0;
}
查找结果:
[Cházhǎo jiéguǒ:]
Find results: