前中后序遍历对比记忆
前中后序遍历对比记忆
- 前中后序遍历快速区分
- 思路(不论程序还是逻辑题)
- 程序例题——JZ4重建二叉树(来自 牛客 “剑指offer” C++)
前中后序遍历快速区分
前序遍历结果: | A | B D H I E J K | C F L M G N O |
中序遍历结果: | H D I B J E K | A | L F M C N G O |
后序遍历结果: | H I D J K E B | L M F N O G C | A |
前序遍历顺序: | 根节点 | 左子树全部 | 右子树全部 |
中序遍历顺序: | 左子树全部 | 根节点 | 右子树全部 |
后序遍历顺序: | 右子树全部 | 左子树全部 | 根节点 |
此处的顺序是指递归顺序!递归顺序!!递归不是循环!!!
递归在整体上是保持上述顺序的而不是周期出现!
思路(不论程序还是逻辑题)
1.有前序遍历时,可以知道二叉树的根节点为前序遍历数组第一位(有后序遍历时,可以知道二叉树的根节点为后序遍历的最后一位)
2.对于中序遍历而言,得知根节点后,可以区分中序编列左右子树的中序遍历,同时也能获得其子树长度,但不能得知左右子树具体结构
3.对于前序遍历而言,得知左右子树任意顺序的数组子树长度后,可以借用左右子树长度在前序遍历中得知对应的左右子树的前序遍历
4.递归:得知左右子树的前序 → 得知根节点 → 得知中序左右子树中序遍历及长度 → 得知左右子树前序遍历 → ……
将上述思路中前序遍历更改为后序遍历,依然同理
唯一区别在于:
后序遍历是先右子树后左子树,前序遍历则是先左子树后右子树
程序例题——JZ4重建二叉树(来自 牛客 “剑指offer” C++)
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {//这里写入代码......}
};
按上述思路给出的答案:
0.排空
int vinlen=vin.size();if(vinlen==0)return NULL;
1.有前序遍历时,可以知道二叉树的根节点为前序遍历数组第一位
TreeNode* head = new TreeNode(pre[0]);
2.对于中序遍历而言,得知根节点后,可以区分中序编列左右子树的中序遍历,同时也能获得其子树长度,但不能得知左右子树具体结构
int root=0;for(int i=0;i<vinlen;i++){if(vin[i]==pre[0]){root=i;break;}}
3.对于前序遍历而言,得知左右子树任意顺序的数组子树长度后,可以借用左右子树长度在前序遍历中得知对应的左右子树的前序遍历
vector<int> pre_left, pre_right, vin_left, vin_right;for(int i = 0; i < root; i++){vin_left.push_back(vin[i]);pre_left.push_back(pre[i+1]);}for(int i = root+ 1; i < vinlen; i++){vin_right.push_back(vin[i]);pre_right.push_back(pre[i]);}
4.递归:得知左右子树的前序 → 得知根节点 → 得知中序左右子树中序遍历及长度 → 得知左右子树前序遍历 → ……
//递归,执行上述步骤,区分子树的左、右子子树,直到叶节点head->left = reConstructBinaryTree(pre_left, vin_left);head->right = reConstructBinaryTree(pre_right, vin_right);return head;
前中后序遍历对比记忆相关推荐
- LeetCode——树:层次遍历、前中后序遍历
LeetCode--树:层次遍历.前中后序遍历 目录 层次遍历 二叉树的层平均值 找树左下角的值 前中后序遍历 概述 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 ...
- 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法
关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
- 二叉树的层序遍历和前中后序遍历代码 迭代/递归
二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 二叉树非递归dfs——简单思路搞定前中后序遍历
前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...
- python实现二叉树非递归前中后序遍历
python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...
- 前中后序遍历-java模板代码
前中后序遍历的知识 1.前序遍历:先遍历根节点,再按照根-左-右的顺序遍历根节点的左子树,最后按照根-左-右的顺序遍历根节点的右子树. 2.中序遍历:先遍历根节点的左子树,按照左-根-右的顺序遍历完之 ...
- 二叉树前中后序遍历以及节点计算
二叉树前中后序遍历以及节点计算 二叉树 分类 二叉链的数据结构 三叉链的数据结构 四种遍历方法 深度优先遍历:前中后序 广度优先遍历:层序遍历 计算 节点个数 叶子节点个数 树的高度 第k层的节点个数 ...
最新文章
- 入华十年,一家互联网外企的“另类”视频广告模式
- jquery-autoComplete 插件使用
- Dandan's lunch
- 计算机科学导论学习资料
- 3 View - 状态保持 session
- MATLAB求线性代数的参数范围,MATLAB科学计算04(线性代数问题求解一)
- 简单公司主页HTML5模板
- MongoDB学习day08--Mongoose索引、Mongoose内置方法、扩展Mongoose Model的静态方法和实例方法...
- Url解码,兼容utf-8和gb2312
- WebRTC系列- SDP详解
- 马克思主义概论(第二章)
- 常用会计科目名词解释
- is_enabled:selenium中判断元素是否可以使用;is_selected()/is_displayed()
- 感受Java的魅力——基于Java二维数组和if语句编制的税后工资计算方法
- 示波器20M硬件带宽限制与数字滤波高低通功能
- [zkaq靶场]FineCMS的存储型XSS
- Element UI学习6--Carousel 走马灯
- 计算机无法安装hp网络打印机,无法安装打印机驱动是怎么回事?不能安装惠普打印机驱动的解决方法...
- 发送邮箱验证码进行注册验证
- Android+Sqlite 实现古诗阅读应用(一)