先中序构建二叉树

数据结构学到二叉树了。觉得有点难了。
大家都知道,先序+中序或者中序+后序才能确定一棵二叉树。
这次用的是先序和中序构建二叉树,再用层序遍历输出。

先序:7 10 4 3 1 2 8 11
中序:4 10 3 1 7 11 8 2
那么层序就是
7 10 2 4 3 8 1 11

struct BinaryTree{
    int data;
    BinaryTree *left;
    BinaryTree *right;
};

由于STL中没有树。所以只能手写啦、

我们知道二叉树的构建是通过递归实现的。

BinaryTree *BuildTree(int *pre,int *in,int n){
    BinaryTree *Node;
    //为了避免无限递归,做一个判空处理。
    if(n<=0)
        return 0;

    Node=new BinaryTree;
    //申请一个新结点
    Node->data=pre[0];
    //先序的第一个是根结点。下一次调用便是子树的结点
    int i0=0;
//下面主要是找到中序中这个结点,左半部分是左子树,右半部分是右子树啦
    for(int i=0;i<n;i++){
        if(pre[0]==in[i])
            i0=i;
    }
    //下面的这个递归确定可以自己下去手写模拟。
    Node->left=BuildTree(pre+1,in,i0);
    Node->right=BuildTree(pre+i0+1,in+i0+1,n-i0-1); 

    return Node;//
} 

这样一趟下来我们就能在内存中,存下这个二叉树啦。

现在就是要层序遍历输出它。
用一个容器来存放数据。层序遍历主要是用队列实现。

void levelorder(BinaryTree *root){
    queue <BinaryTree*> q;
    //将根结点放进去
    q.push(root);
    while(!q.empty()){
        //每次取队首元素。  
        BinaryTree *temp=q.front();
        q.pop();
        tree.push_back(temp->data);
        //查看该结点是否有左右子树,有的话则入队,等待下一次放入容器
        if(temp->left!=0){
            q.push(temp->left);
        }
        if(temp->right!=0){
            q.push(temp->right);
        }

    } 
}

我们上述给的例子的确认过程应该这样

这里写图片描述

后面左右子树也依次类推、
左子树又以10为结点继续往下分析,右子树以2为结点往下分析。

这里写图片描述

所以层序输出时7 10 2 4 3 8 1 11

这里定义的vector是全局变量。

欢迎去这个OJ测试。题号:1104

http://oj.tk-xiong.com/problemset.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值