今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。

首先,我们看看前序、中序、后序遍历的特性: 
前序遍历: 
    1.访问根节点 
    2.前序遍历左子树 
    3.前序遍历右子树 
中序遍历: 
    1.中序遍历左子树 
    2.访问根节点 
    3.中序遍历右子树 
后序遍历: 
    1.后序遍历左子树 
    2.后序遍历右子树 
    3.访问根节点

一、已知前序、中序遍历,求后序遍历

例:

前序遍历:         GDAFEMHZ

中序遍历:         ADEFGHMZ

画树求法:
第一步,根据前序遍历的特点,我们知道根结点为G

第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。

第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。

第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。

第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。

那么,我们可以画出这个二叉树的形状:

那么,根据后序的遍历规则,我们可以知道,后序遍历顺序为:AEFDHZMG

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
typedef struct node
{char data;struct node *leftchild;struct node *rightchild;
} bitreenode,*bitree;
//*preorders是先序的字符串,inorder是中序的字符串
void posttraverse(char *preorder,char *inorder,int len)//求后序
{if(len==0)return ;int rootindex=0;node newnode;newnode.data=preorder[0];//先序字符串的首元素是根节点for(rootindex=0; preorder[0]!=inorder[rootindex]; rootindex++);//这一步是找到根节点在中序字符串中的位置posttraverse(preorder+1,inorder,rootindex);//递归遍历左子树posttraverse(preorder+rootindex+1,inorder+rootindex+1,len-rootindex-1);//递归遍历右子树cout<<*preorder;//打印根节点,为什么要放在最后呢?因为这是求后序遍历,如果是求先序遍历//就在递归之前打印根节点
}
void pretraverse(char *inorder,char *postorder,int len)//求先序
{//类似知先序和中序求后序if(len==0)return ;int rootindex=0;node newnode;newnode.data=postorder[len-1];cout<<postorder[len-1];for(rootindex=0; postorder[len-1]!=inorder[rootindex]; rootindex++);pretraverse(inorder,postorder,rootindex);pretraverse(inorder+rootindex+1,postorder+rootindex,len-rootindex-1);
}/*node* BinaryTreeFromOrderings(char* inorder, char* aftorder, int length)//求先序,同时建树
{if(length == 0){return NULL;}node* Node = new node;//Noice that [new] should be written out.Node->data= *(aftorder+length-1);cout<<Node->data;int rootIndex = 0;for(;rootIndex < length; rootIndex++)//a variation of the loop{if(inorder[rootIndex] ==  *(aftorder+length-1))break;}Node->leftchild = BinaryTreeFromOrderings(inorder, aftorder , rootIndex);Node->rightchild= BinaryTreeFromOrderings(inorder + rootIndex + 1, aftorder + rootIndex , length - (rootIndex + 1));return Node;
}*/
int main()
{int i,j,k,cur,last;char s1[1000],s2[1000];while(scanf("%s",s1)!=EOF){scanf("%s",s2);//posttraverse(s1,s2,strlen(s1));pretraverse(s1,s2,strlen(s1));//BinaryTreeFromOrderings(s1,s2,strlen(s1));cout<<endl;}/*GDAFEMHZADEFGHMZ前一个是先序,后一个是中序*///结果AEFDHZMG/*ADEFGHMZAEFDHZMG前一个是中序,后一个是后序*///结果GDAFEMHZreturn 0;
}
AEFDHZMG/*ADEFGHMZAEFDHZMG前一个是中序,后一个是后序*///结果GDAFEMHZreturn 0;
}

二、已知中序和后序遍历,求前序遍历

依然是上面的题,这次我们只给出中序和后序遍历:

中序遍历:       ADEFGHMZ

后序遍历:       AEFDHZMG

画树求法:
第一步、根据后序遍历的特点,我们知道后序遍历最后一个结点即为根结点,即根结点为G。

第二步、观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。

第三步、观察左子树中序为ADEF,后序AEFD,根据第一步即可判断根节点为D。观察右子树中序HMZ,后序HZM,可以确定根节点为M。

第四步、观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。

这样,我们就可以画出二叉树的形状,如上图所示,这里就不再赘述。

那么,前序遍历:         GDAFEMHZ

具体程序代码已在在上个代码中给出

现在咱们具体来分析下以下语句:

void pretraverse(char *inorder,char *postorder,int len)//求先序
{//类似知先序和中序求后序if(len==0)return ;int rootindex=0;node newnode;newnode.data=postorder[len-1];cout<<postorder[len-1];for(rootindex=0; postorder[len-1]!=inorder[rootindex]; rootindex++);pretraverse(inorder,postorder,rootindex);pretraverse(inorder+rootindex+1,postorder+rootindex,len-rootindex-1);
}

rootindex是根节点的位置,用它来表示左子树和右子树在字符串中的长度

preorder+1是先序左子树开始的位置,inorder的人是中序左子树开始的位置,rootindex是左子树长度

preorder+rootindex+1是右子树开始的位置,同理inorder+rootindex+1是中序串右子树开始的位置,len-rootindex-1是长度

要特别注意子树开始的位置,不能弄错了:如pretraverse(inorder,postorder,rootindex);

pretraverse(inorder+rootindex+1,postorder+rootindex,len-rootindex-1);后序字符串中右子树开始的位置是postorder+rootindex,不是postorder+index+1!!!!!!

二叉树知道前序和中序求后序,知道中序后序求中序相关推荐

  1. 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

    二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...

  2. 二叉树的前序、中序、后序遍历与创建

    #include <iostream> #include <string> #include <stack> using namespace std; struct ...

  3. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  4. 数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历

    一.二叉树的遍历概念 二叉树的遍历是指从根结点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. (1). 前(先)序遍历 前序遍历:若二叉树为空,则空操作返回,否则先 ...

  5. 二叉树的前序遍历,二叉树的中序遍历,二叉树的后序遍历,二叉树的层序遍历

    二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣(LeetCode) (leetcode-cn.com) 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 1: 输入:root ...

  6. 二叉树遍历——前序、后序和中序遍历

    转载:数据结构(五):前序遍历.中序遍历.后序遍历_别把BUG不当代码的博客-CSDN博客_前序中序后序遍历 我们先看下二叉树的前序.后序和中序遍历.遍历下面这个二叉树,分别以前中后三种遍历方式,写出 ...

  7. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  8. 二叉树的前序,中序,后序的递归、迭代实现

    二叉树的前序遍历 递归实现 递归实现没什么好说的.个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的.毕竟自己的脑袋不是电脑,绕着绕着就蒙了. void preordered_traversal_ ...

  9. 二十五、二叉树的前序、中序、后序遍历

    一.为何使用树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较 ...

最新文章

  1. innodb和myisam数据类型,即在存储上有何特点和区别
  2. python语言1002python语言_PYTHON语言学习
  3. Twisted twisted.python.log日志
  4. layui table动态选中_layui后台管理—table 数据表格详细讲解
  5. (2)zynq FPGA AXI_Lite总线介绍
  6. Django contenttypes组件
  7. [转]文件的操作方式
  8. PHP 判断字符的编码 并输出想要的编码格式字符 (转)
  9. LeetCode刷题——80. 删除排序数组中的重复项 II
  10. f5 会话保持 负载均衡_f5会话保持的.doc
  11. kodi资源_Kodi——支持全平台的看片神器
  12. js中求2个数的最大值的几种方法
  13. [管理]ERP专业术语
  14. KD2684S绕组匝间故障检测仪
  15. 【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现
  16. swi prolog 和java_java-如何在Android中使用swi-prolog
  17. 信用卡教育风险预测项目--kaggle算法实战
  18. redis 哨兵模式踩坑
  19. 10行代码教你用Python扫描Excel表格,自动生成条形码!
  20. java线程池场景使用

热门文章

  1. 后台指标计算返回数据格式说明5 - DRAWTEXT_FIX格式
  2. Android关于Firebase集成及示例及用法(开发反编译)
  3. 计算机网络安全 第二章 物理安全
  4. gom引擎和java,GOM和GEE引擎小心!最新漏洞独家首发公布,请各大GM注意了
  5. 2022.05.18-使用Lightroom批量将图像从Raw转换为jpg
  6. 【python学习】——为exe软件创建快捷方式;实现软件自启动
  7. 河道水面漂浮物识别检测系统 YOLOv7
  8. 详解24个经典股票技术指标.doc
  9. 同花顺_代码解析_技术指标_P、Q
  10. “该设备正在使用中。请关闭可能使用该设备的所有程序或窗口 然后重试” 解决步骤