数据结构——二叉排序树的基本操作(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;
}
删除时应注意分以下三种情况:
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;
}
相关文章推荐
- 数据结构:二叉搜索树(BST)的基本操作
- 数据结构:二叉搜索树(BST)全部基本操作
- 数据结构:二叉搜索树(BST)的基本操作
- 数据结构回顾和总结(二叉搜索树(BST)的基本操作)
- 重学数据结构004——栈的基本操作及实现(数组实现)
- 重学数据结构(一):链表基本操作与一元多项式相加
- 【转】数据结构链表操作之双链表的基本操作
- 新手学习数据结构与算法---单链表的基本操作
- bo2-32.cpp 一个数组可生成若干静态链表(数据结构由c2-3.h定义)的基本操作(12个)
- 数据结构基本操作(复制而来)
- 数据结构--二叉树(链表)基本操作
- bo2-31.cpp 一个数组只生成一个静态链表(数据结构由c2-3.h定义)的基本操作(11个))
- [C++]数据结构:有序链表SortedChain的基本实现与操作
- 写给初学数据结构的同学之(循环双链表基本操作,创建,插入,删除,排序)
- 一步一步复习数据结构和算法基础-图的创建和基本操作(邻接矩阵)
- 数据结构 顺序栈基本操作
- 【数据结构】二叉树基本操作的程序实现
- 数据结构类型定义及基本操作汇总(三)--图的表示
- 重学数据结构001――链表基本操作与一元多项式相加
- 一步一步复习数据结构和算法基础-稀疏矩阵基本操作