`
pleasetojava
  • 浏览: 703110 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

二叉排序树(二叉查找树)的各种操作C++最新实现

 
阅读更多

// 链式二叉查找树的各种操作.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

struct BSTree
{
int data;
BSTree *left;
BSTree *right;
};
//标记在插入时,如果已存在,则为true ,表示不需要插入,否则为false
bool flag = false;
int a[100];
//查找操作
BSTree *search(BSTree *r,int x)
{
if(r==NULL)
return NULL;
else
{
if(r->data==x)
return r;
else if(r->data>x)
return search(r->left,x);
else
return search(r->right,x);
}
}
//插入操作
BSTree* insert(BSTree *r,BSTree *s)
{
//首先查找树中是否已存在此节点
BSTree *p = search(r,s->data);
if(p==NULL)
{
if(r==NULL)
{
r=s;
}
else if(s->data<r->data)
r->left = insert(r->left,s);
else if(s->data>r->data)
r->right = insert(r->right,s);
}
else
flag = true;
return r;
}
//建树
BSTree * createBSTree(BSTree *r,int *a,int n)
{
int i;
BSTree * t;
t = r;
for(i=0;i<n;i++)
{
BSTree *s = (BSTree*)malloc(sizeof(BSTree));
s->data=a[i];
s->left=NULL;
s->right=NULL;
t = insert(t,s);
}
return t;
}
//获得其父节点
BSTree *getFather(BSTree *r, BSTree *s)
{
BSTree *sf;
if(r==NULL||r==s)
sf=NULL;
else
{
if(s==r->left||s==r->right)
sf= r;
else if(s->data > r->data)
sf=getFather(r->right,s);
else
sf=getFather(r->left,s);
}
return sf;
}
//删除操作
BSTree * deleteNode(BSTree *r,BSTree *s)
{
//BSTNODE * temp, * tfather, * pf;
BSTree *temp,*father,*sf;
//pf = getfather(p, r);
sf=getFather(r,s);
//被删除结点是叶子结点, 不是根结点
if(s->left==NULL&&s->right==NULL&&sf!=NULL)
//
if(sf->left==s)
sf->left=NULL;
//
else
sf->right=NULL;
//被删除结点是叶子结点,又是根结点
else if(s->left==NULL&&s->right==NULL&&sf!=NULL)
r=NULL;
//
else if(s->left==NULL&&s->right!=NULL&&sf!=NULL)
if(sf->left==s)
sf->left=s->right;
else
sf->right=s->right;
//被删除结点有右孩子,无左孩子.被删结点是根结点
else if(s->left==NULL&&s->right!=NULL&&sf==NULL)
r=s->right;
//被删结点有左孩子,无右孩子.被删结点不是根结点
else if(s->left!=NULL&&s->right==NULL&&sf!=NULL)
if(sf->left==s)
sf->left=s->left;
else
sf->right=s->left;
//被删结点有左孩子,无右孩子.被删结点是根结点
else if(s->left!=NULL&&s->right==NULL&&sf==NULL)
r=s->left;
else if(s->left!=NULL&&s->right!=NULL)
{
temp = s->left;
father = s;
//找出左子树最大的节点
while(temp->right!=NULL)
{
father=temp;
temp=temp->right;
}
s->data = temp->data;
if(father!=s)
father->right = temp->left;
else
father->left=temp->left;
}
if(r==NULL)
cout<<"删除之后,二叉排序树为空!"<<endl;
else
cout<<"删除成功!"<<endl;
return r;
}
//前序输出
void preOrder(BSTree *r)
{
if(r==NULL)
return;
else
{
cout<<r->data<<" ";
preOrder(r->left);
preOrder(r->right);
}
}
//中序输出
void inOrder(BSTree *r)
{
if(r==NULL)
return ;
else
{
inOrder(r->left);
cout<<r->data<<" ";
inOrder(r->right);
}
}
//后续输出
void postOrder(BSTree *r)
{
if(r==NULL)
return ;
else
{
postOrder(r->left);
postOrder(r->right);
cout<<r->data<<" ";
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例个数:"<<endl;
cin>>cases;
while(cases--)
{
int n;
flag = false;
BSTree *root=NULL;
cout<<"请输入元素个数:"<<endl;
cin>>n;
int i;
cout<<"请输入这些元素:"<<endl;
for(i=0;i<n;i++)
cin>>a[i];
cout<<"建立二叉排序树!"<<endl;
root = createBSTree(root,a,n);
if(root!=NULL)
cout<<"二叉排序树建立成功!"<<endl;
else
{
cout<<"二叉排序树建立失败!"<<endl;
return 0;
}
cout<<"此二叉树根的值为:"<<endl;
cout<<root->data<<endl;
cout<<"请选择您要进行的操作:"<<endl;
cout<<"1.插入(I/i)"<<endl;
cout<<"2.查找(S/s)"<<endl;
cout<<"3.删除(D/d)"<<endl;
cout<<"4.先序输出(P/p)"<<endl;
cout<<"5.中序输出(M/m)"<<endl;
cout<<"6.后序输出(L/l)"<<endl;
cout<<"7.退出(E/e)"<<endl;
char s;
cin>>s;
while(1)
{
if(s=='E'||s=='e')
break;
else if(s=='I'||s=='i')
{
cout<<"请输入您要插入的值:"<<endl;
int x;
cin>>x;
BSTree *p =(BSTree*)malloc(sizeof(BSTree));
p->data = x;
p->left = NULL;
p->right = NULL;
root = insert(root,p);
if(flag==false)
cout<<"插入成功!"<<endl;
else
{
cout<<"此二叉树中已存在此值!"<<endl;
flag=false;//恢复原值
}
}
else if(s=='S'||s=='s')
{
cout<<"请输入您要查找的值:"<<endl;
int x;
cin>>x;
BSTree *p=search(root,x);
BSTree *pfather=getFather(root,p);
cout<<"查找的值为:"<<p->data<<endl;
if(pfather!=NULL)
cout<<"其父节点的值为:"<<pfather->data<<endl;
else
cout<<"它是根节点,没有父节点!"<<endl;
if(p->left==NULL&&p->right==NULL)
cout<<"它是叶子节点,没有子节点"<<endl;
else
{
if(p->left != NULL)
cout<<"其左儿子节点的值为:"<<p->left->data<<endl;
else
cout<<"其左儿子节点为空!"<<endl;
if(p->right != NULL)
cout<<"其右儿子的值为:"<<p->right->data<<endl;
else
cout<<"其右儿子节点为空!"<<endl;
}

}
else if(s=='D'||s=='d')
{
cout<<"请输入您要删除的节点的值:"<<endl;
int value;
cin>>value;
cout<<"你确定要删除吗?(Yy/Nn)"<<endl;
char order;
cin>>order;
while(1)
{
if(order=='Y'||order=='y')
{
BSTree * node;
node = search(root,value);
if(node==NULL)
cout<<"该节点不存在!"<<endl;
else
BSTree *nodeDel = deleteNode(root,node);
break;
}
else if(order=='N'||order=='n')
{
break;
}
else
{
cout<<"命令不正确,请重新输入!"<<endl;
cin>>order;
}
}
}
else if(s=='P'||s=='p')
{
cout<<"其前序输出为:"<<endl;
preOrder(root);
cout<<endl;
}
else if(s=='M'||s=='m')
{
cout<<"其中序输出为:"<<endl;
inOrder(root);
cout<<endl;
}
else if(s=='L'||s=='l')
{
cout<<"其后序输出为:"<<endl;
postOrder(root);
cout<<endl;
}
else
{
cout<<"命令有误,请重新输入!"<<endl;
}
cout<<"请选择您要进行的操作:"<<endl;
cin>>s;
}
}
system("pause");
return 0;
}

分享到:
评论

相关推荐

    二叉排序树C++

    数据结构,二叉排序树的C++源代码。可以实现插入,删除,查找功能。

    二叉排序树查找算法

    C++编写的查找算法,用二叉排序树查找,是在VC++6.0上实现的

    二叉排序树 平均查找长度的操作

    文件操作 不少于100个整型数 求平均查找长度 C++

    二叉排序树 学生管理系统

    二叉排序树实现的学生管理 有创建插入 删除 查找等功能

    C++二叉排序树的创建、插入、删除、查找

    二叉排序树,用前序遍历是就是增序排列,的创建删、插入、查询

    二叉排序树最新版本.pdf

    1.2.1编程实现二叉排序树,包括生成、插入,删除; 1.2.2对二叉排序树进行先根、中根、和后根非递归遍历; 1.2.3每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 1.2.4分别用二叉排序树...

    动态查找利用二叉排序树完成动态查找表

    利用二叉排序树完成动态查找表的建立、指定关键字的查找、插入与删除指定关键字结点。 算法输入:指定一组数据。 算法输出:显示二叉排序树的中序遍历结果、查找成功与否的信息、插入和删除后的中序遍历结果(排序...

    二叉排序树的基本操作-创建,查找,删除,插入(C++)

    用顺序表(一维数组)作存储结构,功能如下:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵...(4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。

    二叉链表和顺序表建二叉排序树

    运行环境:Dev-c++ 使用范围:大学c语言数据结构课程设计 功能: 【基本要求】 1.用二叉链表作存储... (4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;

    二叉排序树用二叉链表作存储结构

    二叉排序树。用二叉链表作存储结构。...(3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序 历(执行操作2);否则输出信息“无x”。

    二叉排序树

    大学课程、数据结构、C代码、设计一个读入一串整数构成一颗二叉排序树的程序,从二叉排序树中删除一个结点,使该二叉树仍保持二叉排序树的特性。

    二叉排序树.zip

    二叉排序树.zip 程序设计实践课程设计C++程序源代码 编写程序完成以下功能: (1) 由{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}创建一棵二叉排序树bt并以括号表示法输出; (2) 判断bt是否为一棵二叉排序树; (3) 采用递归和...

    数据结构 二叉排序树的查找

    采用C++语言编写的程序,二叉排序树的查找方法简单。

    查找二叉排序树的双亲节点,并输出路径project

    查找二叉排序树的双亲节点,并输出路径project

    二叉排序树生成

    用C++实现二叉排序树平衡化, 利用伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。它的优势在于不需要记录用于平衡树的冗余信息。在...

    二叉排序树(vc6.0)

    先序形式输入二叉排序树序列,实现查找删除某一结点,以树控件给予显示

    二叉排序树与平衡二叉树的实现

    二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。 二叉平衡树:若...

    二叉排序树头文件,支持基本操作

    自己用C++写的二叉排序树的头文件。 包含二叉排序树的建立,插入,查找,删除,求深度,和以树形结构输出。 VS2010编译通过。

    二叉排序树操作(c++实现)

    printf("1.显示\n"); printf("2.查找\n"); printf("3.插入\n"); printf("4.删除\n"); printf("5.退出\n");

Global site tag (gtag.js) - Google Analytics