中序序列可以与先序,后序,层序序列中的任何一个建立一棵树,而后三者之间两两不能建树(因为无法区分根节点的左右子树)


按先序遍历的顺序来建立树,建树过程类似于斐波那契数列的求项过程

先建立第一层的根节点,接着就按步骤的顺序来建立节点,如下图

上代码

#include <iostream>using namespace std;struct node
{int x;node* lson;node* rson;
};int pre[1000],in[1000];///二叉树的先序区间(prel,prer),中序区间(inl ,inr)
///通过先序区间找出根节点,可将中序区间分为左右子树,然后将左右子树看成单独的树
node* recreat(int prel,int prer,int inl, int inr)
{if(prel>prer) return NULL;///若先序区间长度<=0,则返回空,即没有子树node *root=new node;///建立根节点,并为其开辟空间root->x=pre[prel];///给根节点赋值int k;for(k=inl;k<inr;k++)///中序区间中找出根节点,这样就可以将先序序列分为左右子树{if(in[k]==pre[prel])///pre[prel]是根节点的值,为了将中序序列分为左右子树break;}int num=k-inl;///左子树的节点数目///左子树的先序区间(pre+1,pre+1+num-1),中序区间(inl,k-1)root->lson=recreat(prel+1,prel+1+num-1,inl,k-1);///返回左子树的根节点root,赋给根节点的左儿子///右子树的先序区间(pre+num+1,prer),中序区间(k+1,inr)root->rson=recreat(prel+num+1,prer,k+1,inr);///返回右子树的根节点root,赋给根节点的右儿子return root;
}void post(node* Node)
{if(Node==NULL) return;post(Node->lson);post(Node->rson);cout<<Node->x<<" ";
}int main()
{int n;cin>>n;for(int i=0;i<n;i++) cin>>pre[i];for(int i=0;i<n;i++) cin>>in[i];node* root=recreat(0,n-1,0,n-1);///注意区间是(0,n-1),不是(0,n);否则会多0出来post(root);return 0;
}

满(真)二叉树由先序和后序求中序:
思路:
(1)由题意可知先序遍历[pre_l,pre_r]的pre_l节点为当前树的根节点,赋值给要建立的树的根节点root,
pre_l+1节点为左子树的根节点
(2)通过pre_l+1节点可以在后序遍历[post_l,post_r]中找到节点k,则[post_l,k]序列为后续
遍历的左子树,即原来的树的左子树节点个数为num=k-post_l+1
(3)那么可以将当前的两个序列划分为左右子树:
左子树:先序[pre_l+1,pre_l+num],后序[post_l,k],其根节点赋给root->lson
右子树:先序[pre_l+num+1,pre_r],后序[k+1,post_r-1],其根节点赋给root->rson
(4)递归求解,最后返回根节点

#include <iostream>
#include <cstdio>
using namespace std;struct node
{int x;node* lson;node* rson;node(){lson=rson=NULL;}
};int pre[4000005],post[4000005];node* recreat(int prel,int prer,int postl,int postr)
{node *root=new node;root->x=pre[prel];if(prel==prer) return root;///到叶节点int k;for(k=postl;post[k]!=pre[prel+1]&&k<postr;k++);int num=k-postl+1;///最小为1root->lson=recreat(prel+1,prel+1+num-1,postl,k);root->rson=recreat(prel+num+1,prer,k+1,postr-1);return root;
}int cnt=0,n;
void in(node* Node)
{if(Node==NULL) return;in(Node->lson);printf("%d",Node->x);if(cnt==n) printf("\n");else printf(" ");in(Node->rson);}int main()
{cin>>n;for(int i=0;i<n;i++) scanf("%d",&pre[i]);for(int i=0;i<n;i++) scanf("%d",&post[i]);node* root=recreat(0,n-1,0,n-1);in(root);return 0;
}

二叉树,由先序序列和中序序列建树 / 满(真)二叉树由先序序列和后序序列建树相关推荐

  1. 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...

    本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...

  2. 在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径

    首先需要理解的是,前中后序遍历都是通过递归的方式,将后来需要用到的结点保存在栈中,比如下面这颗树: 如果是前序遍历,根左右,过程是:根节点m入栈并输出,访问m的左孩子a,a入栈并输出,访问a的左孩子c ...

  3. c语言创建一个根结点,创建一个由10个节点组成的二叉树结构,并按前根、中根、后根对该二叉树进行遍历,并输出遍历结果(c语言)...

    满意答案 kanxz1900 2013.04.26 采纳率:50%    等级:12 已帮助:9221人 12345678910111213141516171819202122232425262728 ...

  4. leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析

    目录 1.106题目 2.参考思路:递归切割数组 3.105题目 4.同样思路的代码 1.106题目 2.参考思路:递归切割数组 代码参考:公众号:代码随想录 后序数组+中序数组 以 后序数组(左右中 ...

  5. 根据先序序列和中序,后序和中序序列创建二叉树

    思考:如何才能确定一棵树? 结论:    通过中序遍历和先序遍历可以确定一个树                 通过中序遍历和后续遍历可以确定一个树 通过先序遍历和后序遍历确定不了一个树. 算法实现: ...

  6. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  7. 如何给定二叉树的2个遍历序列(前序中序,中序后序),确定二叉树(方法详解)

    根据前序和中序遍历 给定二叉树 前序(根节点-左节点-右节点):A B D E H C F G 中序(左节点-根节点-右节点):D B E H A F C G 第一步:根据前序就可以判断遍历的第一个就 ...

  8. 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列

    解题思路: 满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个以上的结点 先序序列:DLR 后序序列:LRD 先从最简单的满二叉树开始: 1.只有一个结点的满二叉树 2.有三个结点的满二叉 ...

  9. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】

    题目介绍 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...

最新文章

  1. 45.2mAP+155FPS! PP-YOLO来了, 精度速度双超YOLOv4
  2. linux安装emc的多路径软件,linux (centos)安装EMCPower多路径软件
  3. Spark详解(一):Spark及其生态圈概述
  4. 拯救 Out Of Memory,8个案例带你飞!
  5. Tcpdump使用详解
  6. win10使用自带虚拟机没有Hyper-V场景
  7. Javascript权威指南——第一章Javascript概述
  8. 【渝粤题库】国家开放大学2021春2732土地利用规划题目
  9. 在Outlook中设置类似Foxmail带日期的签名
  10. java容器取交集、并集、补集、差集示例
  11. C语言union类型和C语言 uchar类型的个人见解
  12. centos安装python3、redis和虚拟环境
  13. 汇编大作业(课程设计):简易英英词典
  14. WIFI智能音箱技术方案开发
  15. 面向初学者的 40 多个 Python 项目——开始编写 Python 代码的简单想法
  16. 再生龙备份linux文件多大,使用再生龙Clonezilla备份还原Linux系统
  17. 中石油 : 炸弹安放
  18. Google Earth Engine(GEE)——清华全球不透水层数据中国区域逐年下载
  19. 如何用python批量下载数据_如何用python从wind中批量导出数据
  20. warning no match for this type name:xxx.xxx.xxx [Xlint:invalidAbsoluteTypeName]

热门文章

  1. 小梅哥FPGA:嵌入式块RAM使用之FIFO
  2. 计算机还硬盘后怎么兼容,电脑升级ssd固态硬盘后为什么还是卡?老电脑升级固态硬盘注意事项详解...
  3. Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】
  4. visual studio 2022 更改主题以及调试
  5. 有的人走了,但他的代码还闪耀着光芒
  6. mandatory参数的使用
  7. C/C++笔试面试题
  8. URP Lit Shader解析(2)—LitInput.hlsl
  9. Virbox品牌全新升级,软件加密行业引领者
  10. 解决android sdk中找不到tools目录Android sdkmanager tool not found (D:\Android\SDK\tools\bin\sdkmanager).