中序遍历

二叉树的广义表创建及中序遍历、后序遍历、层次遍历的非递归算法(C语言)

北战南征 提交于 2019-12-03 07:40:14
广义表创建二叉树 关于用广义表的形式表示二叉树的形式如下 ①广义表中的一个字母代表一个结点的数据信息。 ②每个根结点作为由子树构成的表的名字放在义表的前面。 ③每个结点的左子树与右子树之间用逗号分开。若结点只有右子树面无左子树,则该逗号不能省略。 ④在整个广义表的末尾加一个特殊符号(如“@”)作为结束标志。 下面先用自然语言描述算法如下。 依次从广义表中取得-个元素,并对取得的元素做如下相应的处理。 ①若当前取得的元素为字母,则按如下规则建立一个新的(链)结点。 a)若该结点为二叉树的根结点,则将该结点的地址送T。 b)若该结点不是二叉树的根结点,则将该结点作为左孩子(若标志flag为1)或者右子若标志flag为2)链接到其双亲结点上(此时双亲结点的地址在栈顶位置)。 ②若当前取得的元素为左括号“(”,则表明一个子表开始,将标志flag置为1,同时将面那个结点的地址进栈。 ③若当前取得的元素为右括号“)”,则表明一个子表结束,做退栈操作。 ④若当前取得的元素为逗号,则表明以左孩子为根的子树处理完毕,接着应该处理孩子为根的子树,将标志flag置为2。 如此处理广义表中的每一个元素,直到取得广义表的结束符号“@”为止。 二叉树的中序遍历(非递归) 算法的核心思想是: 当P所指的结点不为空时.则将该结点所在链结点的地址进栈,然后再将”指向该结点的左孩子结点

二叉树前序、中序、后续、广度优先遍历

江枫思渺然 提交于 2019-12-03 04:30:53
二叉树遍历: 有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。 四种遍历思想: 前序:根–>左子树–>右子树 中序:左子树–>根–>右子树 后序:左子树–>右子树–>根 层次遍历:按层一层层遍历 例如,求下面二叉树的各种遍历 代码实现 首先查看二叉树结构的定义: package com.syj.test.tree; import lombok.Data; /** * Created by syj on 2018/12/25. */ @Data public class BinaryTree { BinaryTree(String val) { this.val = val; } //当前节点值 private String val; //左子树 private BinaryTree left; //右子树 private BinaryTree right; } 各种遍历 前中后序遍历采用递归的方式,只是在输出的地方不同,其他地方一样,大家体会下为什么这样做。 广度优先,采用的是队列的方式,按层 先进先出。 package

【大话数据结构】二叉树的遍历(前序 中序 后续 层次 深度优先 广度优先 DFS BFS)

自古美人都是妖i 提交于 2019-12-03 04:30:39
书籍推荐 《大话数据结构》—— https://www.loneway.ren/book/detail/20006 二叉树的遍历 二叉树的遍历方式有两类:深度优先遍历和广度优先遍历。 深度优先遍历 深度优先遍历是指顺着某一条路径尽可能的向前探索,必要的时候(探索到叶子节点)回溯。 遍历顺序: 先根序遍历(DLR) 中根序遍历(LDR) 后根序遍历(LRD) 实现方法: 递归方法 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ assert isinstance

二叉树遍历(前序、中序、后序、层次、深度优先)递归和非递归 java实现

五迷三道 提交于 2019-12-03 04:30:20
二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树, 有深度遍历 和 广度遍历 ,深度遍历有 前序、中序以及后序 三种遍历方法,广度遍历即我们寻常所说的 层次遍历 。由于树的定义本身就是递归定义,因此採用递归的方法去实现树的三种遍历不仅easy理解并且代码非常简洁,而对于广度遍历来说,须要其他数据结构的支撑。比方堆了。 四种基本的遍历思想为: 前序遍历:根结点 —> 左子树 —> 右子树 中序遍历:左子树—> 根结点 —> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:仅仅需按层次遍历就可以 比如。求以下二叉树的各种遍历 1 / \ 2 3 / \ / 4 5 6 / \ 7 8 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 6 3 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 二叉树的代码 public class TreeNode { public int val ; public TreeNode left , right ; public TreeNode ( int val ) { this . val = val ; this . left = this . right = null ; } } 一、前序遍历 1)依据上文提到的遍历思路:根结点

二叉树的深度优先遍历和广度优先遍历

你离开我真会死。 提交于 2019-12-03 04:30:07
1. 分析 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 2. 举例说明 对下图所示的二叉排序树进行遍历,要求使用先序遍历(递归、非递归)、中序遍历(递归、非递归)、后序遍历(递归、非递归)和广度优先遍历。 2.1 参考代码 package BinaryTreeTraverseTest; import java.util.LinkedList; import java.util.Queue; /** * 二叉树的深度优先遍历和广度优先遍历 * @author Fantasy * @version 1.0 2016/10/05 - 2016/10/07 */ public class

PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

大城市里の小女人 提交于 2019-12-03 04:29:51
前言: 深度优先遍历 :对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点 广度优先遍历 :又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 例如对于一下这棵树: 深度优先遍历: 前序遍历:10 8 7 9 12 11 13 中序遍历:7 8 9 10 11 12 13 后序遍历:7 9 8 11 13 12 10 广度优先遍历: 层次遍历:10 8 12 7 9 11 13 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历: 1、前序遍历: /** * 前序遍历(递归方法) */ private function pre_order1( $root ) { if ( ! is_null( $root )) { //这里用到常量__FUNCTION__,获取当前函数名,好处是假如修改函数名的时候,里面的实现不用修改 $function = __FUNCTION__; echo $root -> key . "

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

有些话、适合烂在心里 提交于 2019-12-03 04:29:14
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历: 左子树 ---> 根结点 ---> 右子树 后序遍历: 左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 例如,求下面二叉树的各种遍历 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 3 6 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 一、前序遍历 1)根据上文提到的遍历思路: 根结点 ---> 左子树 ---> 右子树,很容易写出递归版本: public void preOrderTraverse1(TreeNode root) { if (root != null) { System.out.print(root.val+" "); preOrderTraverse1(root.left);

二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
1、树   树的常用术语 2、二叉树 3、查找节点 4、插入节点 5、遍历树 6、查找最大值和最小值 7、删除节点     ①、删除没有子节点的节点   ②、删除有一个子节点的节点   ③、删除有两个子节点的节点   ④、删除有必要吗? 8、二叉树的效率 9、用数组表示树 10、完整的BinaryTree代码 11、哈夫曼(Huffman)编码   ①、哈夫曼编码    ②、哈夫曼解码 12、总结   前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。   那么我们就希望一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 树 诞生了。 回到顶部 1、树    树 ( tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限 节点 通过连接它们的 边 组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。      ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。   ②、边

数据结构――一些概念

匿名 (未验证) 提交于 2019-12-03 00:39:02
数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系 图状结构或网状结构 结构中的数据元素之间存在多对多的关系 物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等 在数据结构中,从逻辑上可以将其分为线性结构和非线性结构 数据结构的基本操作的设置的最重要的准则是, 实现应用程序与存储结构的独立 。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。 顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中

剑指offer--重建二叉树

匿名 (未验证) 提交于 2019-12-03 00:37:01
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 必备知识点:前序遍历(根左右), 中序遍历(左根右),前序遍历第一个数1必是根节点,对应到中序遍历中根节点的位置,左边的数位于左子树,右边的数位于右子树;可以看出,1节点同时拥有左右子树;然后, 前序遍历中第二个数字2作为节点,对应到中序遍历中,左边为左子树,同时,右边没有数,所以2节点没有右子树。所以,可以通过递归实现二叉树重建。 TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) { if (pre.empty() == NULL || vin.empty() == NULL) return NULL; size_t index = 0; for (; index < vin.size(); index++) { if (vin[index] == pre[0]) break; } TreeNode* root = new TreeNode(pre[0]); vector<int> pre_left, vin_left; vector<int> pre