先中序构建二叉树
来源:互联网 发布: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
- 先中序构建二叉树
- 如何构建二叉树
- 如何构建二叉树
- 构建二叉树实例
- 构建二叉树
- leetcode:构建二叉树
- 二叉树的构建
- C++构建二叉树
- 构建二叉树
- 二叉查找树构建
- 构建二叉树
- 构建二叉树(swift)
- Java 构建二叉树
- 构建二叉树
- 二叉树遍历&构建
- 构建平衡二叉树
- 重新构建二叉树
- 构建二叉树
- react-router4 实现按需加载
- 从单例模式挖到内存模型(四)----java内存模型
- memset 、ZeroMemory和 “={0}” 三者区别
- PHP YII框架开发安全基本准则
- zzuli 2130 hipercijevi bfs + 链式前向星 + 输入外挂
- 先中序构建二叉树
- Vue的自定义控件
- Maven 实战系列之在Windows上安装Maven
- iOS导航控制器——UINavigationController使用详解
- join(long)与sleep(long)的区别
- LSH︱python实现MinHash-LSH及MinHash LSH Forest——datasketch(四)
- QT问题:Failed to start program. Path or permissions wrong?已经解决
- 商人的诀窍 (sdut oj)
- ios加载本地html,css样式失效问题