先中序构建二叉树

来源:互联网 发布:proteus怎么仿真单片机 编辑:程序博客网 时间:2024/06/13 18:20

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

先序: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 0
原创粉丝点击