二叉排序树的实现
2016-07-07 20:07
471 查看
二叉排序树是一颗特殊的二叉树:对于树上的任意一个结点,根节点的值一定大于其左子树上的任意结点的值,一定小于其右子树上任意结点的数值。
所以我们可以插入实现二叉排序树,思路可以这样:
1、若当前树为空,则x为根节点
2、如果树不为空,比较根节点与之大小,若插入值小于根节点,就继续比较跟节点的左子树,即最终插入左子树中,否者插入右子树中。
我们以4、2、6、1、3为例,二叉树建树过程如下:
现在实现,输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
结果:
所以我们可以插入实现二叉排序树,思路可以这样:
1、若当前树为空,则x为根节点
2、如果树不为空,比较根节点与之大小,若插入值小于根节点,就继续比较跟节点的左子树,即最终插入左子树中,否者插入右子树中。
我们以4、2、6、1、3为例,二叉树建树过程如下:
现在实现,输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
#include<stdio.h> #include<string.h> struct Node{ Node *lchild; Node *rchild; int data; }Tree[100]; int loc; Node *creat(){ Tree[loc].lchild=Tree[loc].rchild=NULL; return &Tree[loc ++]; } Node *build(Node *T,int x){ if(T==NULL){ T=creat(); T->data=x; return T; } else if(x<T->data){ T->lchild=build(T->lchild,x); } else if(x>=T->data){ T->rchild=build(T->rchild,x); } return T; } void preOrder(Node *T){ printf("%d",T->data); if(T->lchild!=NULL){ preOrder(T->lchild); } if(T->rchild!=NULL){ preOrder(T->rchild); } } void inOrder(Node *T){ if(T){ if(T->lchild!=NULL){ inOrder(T->lchild); } printf("%d",T->data); if(T->rchild!=NULL){ inOrder(T->rchild); } } } void postOrder(Node *T){ if(T){ if(T->lchild!=NULL){ postOrder(T->lchild); } if(T->rchild!=NULL){ postOrder(T->rchild); } printf("%d",T->data); } } int main(){ int n; loc=0; scanf("%d",&n); Node *T = NULL; for(int i=0; i<n; i++){ int x; scanf("%d",&x); T=build(T,x); } //Traval preOrder(T); printf("\n"); inOrder(T); printf("\n"); postOrder(T); printf("\n"); return 0; }
结果:
相关文章推荐
- 虚拟机一些常见的错误
- http://my.oschina.net/pangyangyang/blog/144495
- Mac锁屏
- 计算机程序的思维逻辑 (24) - 异常 (上)
- Java制作证书的工具keytool用法总结
- 数据挖掘学习笔记-分类(1)
- 【基础算法】嵌套矩形
- HummingBad恶意软件(介绍)
- Apache 部署https证书
- Android APP更新——service后台下载、进度提示、自动安装
- 《失控》第一章读书笔记
- MySQL DATE_FORMAT()函数的使用
- CentOS7安装配置redis-3.0.0
- hdu 2860 Regroup 带权并查集
- Java基础学习总结——Java对象的序列化和反序列化
- HDU 5361 最短路变形
- 使用PuTTY时的文件上传下载方法
- lintcode:删除链表中指定元素
- CSS3径向渐变(radial-gradient)
- hdu 4421 Bit Magic【2--Sat----------Tarjan强连通】