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

数据结构——二叉排序树的基本操作(BST)

2017-05-25 00:22 330 查看
简单实现了:二叉排序树查找、插入、删除、建立算法的思想及程序实现

删除时应注意分以下三种情况:

1.如果删除的节点没有左子树,直接把把右子树提上去;

2.如果左子树没有右子树,直接把左子树提上去;

3.其他情况就直接找左子树的最大的叶子节点提上去;

以下代码借鉴:挑战程序设计
代码:

#include<bits/stdc++.h>
#define N 109
using namespace std;

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

void menu()
{
cout << endl;
printf("\t\t\t1.建立二叉排序树\n");
printf("\t\t\t2.插入元素x\n");
printf("\t\t\t3.删除元素x\n");
printf("\t\t\t4.查找元素x\n");
printf("\t\t\t5.遍历(中序)\n");
printf("\t\t\t6.退出\n\n");
}

node *Insert(node *t, int x)
{
if(t == NULL)
{
node *p = new node;
p->data = x;
p->lch = p->rch = NULL;
return p;
}
if(t->data == x) printf("排序树中已经有该元素,插入失败!\n");
else if(t->data > x) t->lch = Insert(t->lch, x);
else t->rch = Insert(t->rch, x);
return t;
}

node *Create(node *t)
{
printf("输入n,以及n个元素\n");
int n, i, x;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &x);
t = Insert(t, x);
}
printf("创建成功!\n");
return t;
}

node *Delete(node *t, int x)
{
if(t == NULL) return NULL;
else if(t->data > x) t->lch = Delete(t->lch, x);
else if(t->data < x) t->rch = Delete(t->rch, x);
else if(t->lch == NULL)
{
node *p = t->rch;
delete t;
printf("删除成功!\n");
return p;
}
else if(t->lch->rch == NULL)
{
node *p = t->lch;
p->rch = t->rch;
delete t;
printf("删除成功!\n");
return p;
}
else
{
node *p;
for(p = t->lch; p->rch->rch != NULL; p = p->rch) ;
node *r = p->rch;
r->lch = t->lch;
r->rch = t->rch;
p->rch = NULL;
delete t;
printf("删除成功!\n");
return r;
}
return t;
}

bool Find(node *t, int x)
{
if(t == NULL) return false;
if(t->data == x) return true;
if(t->data > x) return Find(t->lch, x);
return Find(t->rch, x);
}

void display(node *t)
{
if(t)
{
display(t->lch);
printf("%d ", t->data);
display(t->rch);
}
}

int main()
{
node *t = NULL;
while(true)
{
menu();
int sel, x;
scanf("%d", &sel);
switch(sel)
{
case 1: t = Create(t); break;
case 2: printf("输入元素x\n"); scanf("%d", &x); t = Insert(t, x); break;
case 3: printf("输入元素x\n"); scanf("%d", &x); t = Delete(t, x); break;
case 4: printf("输入元素x\n"); scanf("%d", &x);
if(Find(t, x)) printf("Yes\n");
else printf("No\n"); break;
case 5: display(t); cout << endl; break;
}
if(sel == 6) break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: