中序与后序或者前序都可以确定一颗二叉树 一点点dfs

中序与后序或者前序都可以确定一颗二叉树原理: 
中序是 访问顺序是
左子树 根 右子树

后续是

左子树 右子树 根

所以一棵二叉树如果给了后续的信息 可以把树根确定下来

带入中序的信息中 找出左右子树 再带回后续的信息找这样反复,也就是递归下去,可以把树给确定下来。

DFS  大概可以用于 又要向下延伸 又要左右延伸  比如 枚举 ,搜索 都可以用;

时间: 2024-08-27 11:29:35

中序与后序或者前序都可以确定一颗二叉树 一点点dfs的相关文章

二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了.所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多. 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

Leetcode:Construct Binary Tree 前序和中序、后序和中序构建二叉树

前序和中序构建二叉树 后序和中序构建二叉树 分析:主要思路就是 在中序中找根节点然后划分左右子树,具体如下: 1. 查找根节点. 我们知道前序序列的第一个元素 和 后序序列的最后一个元素 肯定是根节点,我们就以此为突破口 2. 确定根节点的坐标. 我们在 中序序列中找到 根节点 的下标. 3. 分割左右子树. 对于中序序列:根节点下标之前的都属于左子树,之后的都属于右子树 对于先序序列:根节点之后的 一段元素(该段长度可以由中序序列的左子树长度确定)属于左子树,左子树之后的元素属于右子树 对于先

二叉树前序遍历+中序遍历->后序遍历

BNU的基础题,数据结构的基础题,顺便搞下. 二叉树是一种常用的数据结构.我们可以用大写的英文字母表示二叉树的节点. 如下: B / \ / \ C A D 对于二叉树,有前序.中序和后序三种遍历方式. 现在给你一棵二叉树的前序和中序遍历,请你求出这棵二叉树的后序遍历结果. Input 输入数据有多组,每组数据一行. 每行由两个字符串组成(每个字符串长度最大为26).表示一棵二叉树的前序和中序遍历结果. 题目保证前序和中序遍历是合法的(即肯定可以确定一棵二叉树). Output 对于每组输入,输

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

根据前序遍历和中序遍历构建二叉树以及根据中序遍历后序遍历构建二叉树

<pre name="code" class="cpp">/************************************************************************/ /* 算法说明: 由中序遍历序列可知,第一个节点是根节点, 由前序遍历序列可知,第一个节点是根节点的左子树节点,而且前序遍历中,根节点左边是左子树,右边是右子树,因此通过中序遍历的根节点可以确定的是: 根节点在前序遍历中的位置(通过遍历前序遍历序列,

二叉树的前序、中序、后序遍历迭代实现

二叉树的前序.中序.后序遍历迭代实现 二叉树的前序遍历,迭代实现 根-左-右 思路: 1. 借用栈的结构 2. 先push(root) 3. node = pop() 3.1.list.add( node.val ) 3.1.push( node.right ) 3.3.push( node.left ) 4.循环步骤3直到栈空 肯定很难理解,我们一步步执行下,请看图 我们来实现一下代码 public List<Integer> preorderTraversal(TreeNode root)