本题的核心是根据前序和中序序列建树,显然这可以用递归去实现。
1 每次从前序序列中找到根节点存入树当中
2 遍历中序序列中找到该根结点位置,就可以划分出左右子树
3 先递归建左子树(也就是重复1、2),此时ipre=ipre+1,imid=0,n=i
4 再递归建右子树(也就是重复1、2),此时ipre=ipre+i+1,imid=imid+i+1,n=n-i-1(因为建完了左子树,所以需要跳过左子树的i个结点,结点个数也需要减掉左子树的i个结点)

#include<iostream>
using namespace std;
struct BiNode{char data;BiNode * lchild;BiNode * rchild;
};
//pre、mid分别存储前序和中序序列,ipre、imid分别是前序和中序开始遍历的位置,n为树的结点个数
BiNode *CreateByPreMid(char *pre,char *mid,int ipre,int imid,int n)
{if(n==0)return NULL;BiNode *p=new BiNode;p->data=pre[ipre];int i=0;while(pre[ipre]!=mid[imid+i]) i++;p->lchild=CreateByPreMid(pre,mid,ipre+1,imid,i);p->rchild=CreateByPreMid(pre,mid,ipre+i+1,imid+i+1,n-i-1);return p;
}
void PreOrder(BiNode *p)
{if(p){cout<<p->data;PreOrder(p->lchild);PreOrder(p->rchild);}
}
int Height(BiNode *p)
{if(p==NULL)return 0;int left,right;left=Height(p->lchild);right=Height(p->rchild);if(left>right)return left+1;elsereturn right+1;
}
int main()
{char pre[55],mid[55];BiNode *root;int n;cin>>n;for(int i=0;i<n;i++){cin>>pre[i];}for(int i=0;i<n;i++){cin>>mid[i];}root=CreateByPreMid(pre,mid,0,0,n);cout<<Height(root)<<endl;return 0;
}

根据前序中序序列建树相关推荐

  1. 二叉树,由先序序列和中序序列建树 / 满(真)二叉树由先序序列和后序序列建树

    中序序列可以与先序,后序,层序序列中的任何一个建立一棵树,而后三者之间两两不能建树(因为无法区分根节点的左右子树) 按先序遍历的顺序来建立树,建树过程类似于斐波那契数列的求项过程 先建立第一层的根节点 ...

  2. 二叉树前序中序,后序中序,公共最近祖先的实现

    二叉树前序中序,后序中序,公共最近祖先的实现 注释中详细介绍了算法,故不再赘述. 无论是前序还是后序,一个节点的左子树和右子树都是可以看做是分开的,有一定规律可循,故可用递归进行实现. #includ ...

  3. 【算法】【树】已知先序中序序列求后序序列(详细解释)

    题目描述 如题所示,已知先序中序序列建树与求后序序列 算法原理 利用递归和分制的思想,找到当前树先序序列的根节点,然后找到对应中序序列的位置,然后根据根节点在中序序列中的位置来判断左右子树分别的位置, ...

  4. PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树

    文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...

  5. PAT甲级1043 Is It a Binary Search Tree :[C++题解]判断二叉搜索树BST、给定前序序列和中序序列

    文章目录 题目分析 题目链接 题目分析 二叉搜索树(BST):左子树小于根结点,右子树大于等于根结点. 二叉搜索树的中序遍历一定是有序序列.所谓中序遍历:先访问左子树,再访问根结点,最后访问右子树. ...

  6. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  7. leetcode105 前序中序遍历序列构造二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15 ...

  8. 栈的亚特兰数与二叉树的前序中序遍历序列

    栈的亚特兰数与二叉树的前序中序遍历 @(算法学习) 已经熟知的是二叉树的中序遍历和先序遍历可以唯一确定一棵树. 更有趣的知识点是,以先序遍历序列作为入栈序列,那么出栈序列恰为中序遍历.这样就把两种遍历 ...

  9. 树与二叉树——由前序序列和中序序列确定一刻二叉树

    确定一棵二叉树的方法可以使用扩展二叉树来构建以可二叉树,也可以通过由前序序列和中序序列或者由前序序列和后序序列来确定一棵二叉树. 例如由前序序列和中序序列来确定一棵二叉树,这里用到的方法是利用递归算法 ...

最新文章

  1. 备份CSDN博客正文到本地存档
  2. webpack 开发模式管理 Development
  3. android app增加内存大小,android – 增加分配给应用程序的内存
  4. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
  5. [WCF REST] 通过ASP.NET Output Caching实现声明式缓存
  6. 川崎机器人总线通信_【川崎】川崎机器人PROFINET 总线通信图文教程(上)
  7. JavaScript中十个一步拷贝数组的方法
  8. python post请求rsa加密_Python的加密方式:RSA加密
  9. 为什么越来越多的开发者选择使用Spring Boot
  10. LeetCode 5381. 查询带键的排列
  11. Java IO实战操作(一)
  12. .NET动态调用WebService
  13. flex怎么设置调用的外部浏览器
  14. FreeRTOS 入门
  15. java怎么部署_java项目服务器如何部署?项目服务器的部署步骤
  16. Java类的三大特性
  17. 凑硬币算法C语言,《凑硬币》 动态规划算法入门
  18. oa系统需要的服务器配置,oa办公系统需要服务器配置
  19. Linux系统Word转换PDF,文档字体乱码不显示问题解决
  20. Open3D Mesh 网格

热门文章

  1. 我的MYSQL学习心得(十七) 复制
  2. 华为手机助手上架流程_华为手机助手系统怎样更新?系统更新流程图文介绍
  3. GauGAN,Semantic Image Synthesis with Spatially-Adaptive Normalization 论文阅读
  4. 用SAX优化读excel文件的内存消耗
  5. 运行jar文件出现了Exception in thread “main java.lang.UnsupportedClassVersionError
  6. android开发人员要求_如何成为一名Android开发人员
  7. 华清远见web后端学习总结
  8. 五分钟学会各种环形进度条
  9. python操作数据库游标_Python 数据库游标对象
  10. 如何安装 wxPython 开始 python GUI 编程