树表中二叉树树查找方法以及平衡树的简解

来源:互联网 发布:支付宝软件下载 编辑:程序博客网 时间:2024/06/03 21:25

树表,其实说白了就是以树结构为基础,动态链式存储结构构建的。

那么,前面顺序表的查找相信大家不陌生了,这里我们有必要说明两种树结构(主要还是说二叉树)。

相信大家对java里面集合treemap还是有了解的,这里我们C语言的二叉树中的二叉排序树就是这样一种结构,另外还有平衡二叉树,下面一一细解。

1.二叉排序树的两种查找方法

A.非递归查找方法B递归查找方法,这两种方法理解都不难,读者细心读代码注释,相信很快就能入手掌握。

关键难点还是构建二叉排序树的问题,主要思路也写在代码注释中。

//超超
//2016 10 8
#include<iostream>
using namespace std;
typedef int elementtype;
typedef int keytype;
typedef struct linknode{
elementtype data;
struct linknode *lchild;
struct linknode *rchild;
}bnode;
int main(){
bnode *t;
void create_binary_sort_tree(bnode *&t);
create_binary_sort_tree(t);
void inorder(bnode *t);
cout<<"您建立的二叉排序树为(使用中序遍历)(是排好序的递增序列):"<<endl;
inorder(t);
cout<<endl;

//使用非递归查找
bnode *bst_search1(bnode *t,keytype x);
cout<<"请输入要查找的数:";
keytype x;
cin>>x;
if(bst_search1(t,x)==NULL) cout<<"不好意思哈,您的序列中没有"<<x<<"这个数:";
else cout<<"找到了,您的序列中含有"<<x<<"这个数"<<endl;

//使用递归查找

bnode *bst_search2(bnode *t,keytype x);
cout<<"请输入要查找的数:";
keytype x;
cin>>x;
if(bst_search2(t,x)==NULL) cout<<"不好意思哈,您的序列中没有"<<x<<"这个数:";
else cout<<"找到了,您的序列中含有"<<x<<"这个数"<<endl;
return 1;
}
//必然需要先构造一颗二叉排序树,很简单,必然要采用动态链式结构去构建这样一颗二叉排序树
/*思路:同构建链栈,链队列一般,先定义要添加的结点,然后进行符合运算的二叉排序树算法
  二叉排序树的特点:
若插入该值是小于根节点的值,则往左子树添加,否者就往右子树添加
以后做每一次的递归调用来添加相应的结点。*/
//创建一个二叉排序树
void create_binary_sort_tree(bnode *&t){
elementtype x;
t=NULL;
cout<<"请输入要插入的结点数据值(提示:输入-9999表示结束插入!):"<<endl;
cin>>x;
while(x!=-9999){
bnode *s=new bnode;//每插入一次,都要新建一个结点来保存数据
s->data=x;
s->lchild=NULL;//插入结点的左子树为空
s->rchild=NULL;//插入结点的右子树也为空
void insert_binary_sort_tree(bnode *&t,bnode *s);
insert_binary_sort_tree(t,s);
cin>>x;
}
}
//二叉排序树的结点插入
void insert_binary_sort_tree(bnode *&t,bnode *s){
if(t==NULL) t=s;//第一步空树,要将结点插入成为根节点
else if(t->data>s->data) insert_binary_sort_tree( t->lchild,s);//若小于根节点,就插入到左子树中
else insert_binary_sort_tree(t->rchild,s);//若大于根节点,就插入到右子树中
}
//为了便于使用这个二叉排序树可以考虑使用中序遍历来查看序列是否是递增的
void inorder(bnode *t){
if(t!=NULL){
inorder(t->lchild);//先遍历左结点
//visite(t);
cout<<t->data<<" ";//打印当前结点
inorder(t->rchild);//在遍历右结点
}
}

//二叉排序树的非递归查找算法,同前面一样,查找必然是要遍历的,但排好顺序的二叉树呢?使用上他的特点可以让查找速度加快
bnode *bst_search1(bnode *t,keytype x){
bnode *p=t;
while(p!=NULL) {
if(p->data==x) return p;
else if (x<p->data) p=p->lchild;//数据小于根,说明数据结点在左子树
else p=p->rchild;//数据大于根,说明数据结点在右子树
}
return p;
}
//二叉排序树的递归查找算法,同前面一样,查找必然是要遍历的,但排好顺序的二叉树呢?使用上他的特点可以让查找速度加快
//使用递归来的效率会更高,运算上其实很简单
bnode *bst_search2(bnode *t,keytype x){
if(t==NULL||t->data==x) return t;
//当X小于t结点的值,说明x在t结点的左子树,便将左子树的结点作为参数传给查找函数
else if(t->data>x) return bst_search(t->lchild,x);
//当X大于t结点的值,说明x在t结点的右子树,便将右子树的结点作为参数传给查找函数
else return bst_search(t->rchild,x);
}

好了,相信读者已经明白了二叉排序树的构建以及两种查找方式了。

2.下面是平衡二叉树的简解:

平衡二叉树(balance binary tree):(AVL树)

左右子树的高度之差的绝对值不超过1,左右子树都是平衡二叉树。什么意思?就是说这样一棵树是像金字塔一样的,而不是缺胳膊少腿的,当然,缺一点点也是没关系的,但只能缺的是一个叶子结点,看起来很有平衡感,所以才称之为平衡二叉树。

这样一颗树有啥用呢,基于前面二叉排序树,将其转化成平衡的二叉树,那么,查找的高度会被减低,也就意味着查找算法的时间会降低,性能还会提高。


1 0
原创粉丝点击