今天差不多是把二叉树的结构看完
听说二叉树是能够用来排序的
于是今天就来试一试
首先给出如下的一组乱序数
开始想着用数组来存放这一串数组,但是,我们有二叉树呀,二叉树也可以用来存放数据
首先我们肯定要定义一个这样的结构体
typedef struct Tree
{
int data;
struct Tree *lchild;//左孩子
struct Tree *rchild;//右孩子
}tree;
接下来就是解决如何存储的问题
二叉树,二叉树,顾名思义,有左右两个分叉,对于排序的数据而言,也就刚好只有两种关系
一个大,一个小。
假设我们左边放小的,右边放大的,遇到的第一个就为根
那么:2 6 1 4 7 5 3
排列下来
就是这个样子
左孩子永远小于双亲,右孩子永远大于双亲
然后我们就来写一下相应的代码
首先是是新建节点
//新建节点
tree *add(int data)
{
tree *infor=new tree;
infor->data=data;
infor->lchild=NULL;
infor->rchild=NULL;
return infor;
}
然后是插入节点
int insert(tree *point,tree *present)//point:要插入的点 present:当前查找到的位置
{
tree *child;//用来指向present的孩子
// 如果插入的点的数据比查找点的数据大,就指向右孩子
if(point->data>present->data)
{
//判断孩子是否为空
// 为空就插入,并且结束递归
child=present->rchild;
if(child==NULL)
{
present->rchild=point ;
return 0;
}
}
//否则指向左孩子
else
{
//判断孩子是否为空
// 为空就插入,并且结束递归
child=present->lchild;
if(child==NULL)
{
present->lchild=point ;
return 0;
}
}
// 如果孩子不为空,就继续递归查找
insert(point ,child);
}
这样我们就建立出了这样的一棵树
接下来就是我们该如何按照顺序的读出数据
按照道理来说,我们读出的顺序应该是1 2 3 4 5 6 7
我们如果从图中走一遍就不难发现,走的顺序就是
第一:尽量往左走,并且走到底,输出最底下的孩子
第二:走到底后, 回到双亲,并输出双亲
第三:往右走,有孩子就继续按照前面两步走,没有的话,就输出该节点。
其实就是树的中序
写的方法也有两种,一种就是深度探索,另外一种就是通过栈来写
首先我们说第一种:深度探索
深度探索,简而言之就是一条路走到黑,一直往左走,当不能走了,才返回到双亲并往右走。
当左边不能走的时候,或者是已经走过(返回双亲)的时候就输出
然后就是写代码
int prin(tree *present)//当前查找到的位置
{
if(present==0)
return 0;
if(present->lchild)//先找左孩子
prin(present->lchild);
cout<<present->data<<' ';//输出数据
//找右孩子
if(present->rchild)
prin(present->rchild);
}
计算起来也是毫无压力
然后就是第二种方法:通过栈来输出数据
首先我们要清楚,怎么通过栈来输出结果
栈的规则就是后进先出
规则其实也和深度搜索有些类似
我们按照这样的一个规律
1.先将当前节点入栈,定位到左孩子
2.有则继续入栈定位,
3.否则,出栈,定位右孩子
就按照这样的一个规律
具体的代码如下
typedef struct Stack
{
tree *node;
struct Stack *next;
}stack;
stack *top=NULL;//栈顶
int push(tree *receive)//入栈
{
stack *infor=new stack;
infor->node=receive;
infor->next=top;
top=infor;
}
int pop()//出栈
{
cout<<top->node->data<<' ';
top=top->next;
}
int prin(tree *present)//当前查找到的位置
{
push(present);//将当前节点入栈
if(present->lchild)//判断左孩子是否为空
prin(present->lchild);
pop();//出栈
if(present->rchild)//判断右孩子是否为空
prin(present->rchild);
}
相当于就是通过栈来完成中序输出