通过二叉树来对数组进行排序

今天差不多是把二叉树的结构看完

听说二叉树是能够用来排序的

于是今天就来试一试

首先给出如下的一组乱序数

开始想着用数组来存放这一串数组,但是,我们有二叉树呀,二叉树也可以用来存放数据

首先我们肯定要定义一个这样的结构体

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);

}

相当于就是通过栈来完成中序输出

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值