后序遍历

二叉树的存储结构以及遍历

依然范特西╮ 提交于 2019-12-03 23:45:35
一、二叉树的存储结构 ————顺序存储(一维数组)——— 1 #define MaxSize 100 //假设二叉树最大编号为99 2 typedef char DataType; //定义二叉树节点的数据类型,假设为char型 3 typedef struct{ 4 DataType data[MaxSize]; 5 int biTreeNum; //二叉树的节点个数 6 }SeqBiTree; ——————二叉链表———————— 1 typedef char DataType; 2 typedef struct BiNode{ 3 DataType data; 4 struct BiNode * lchild,* rchild; 5 }BiNode; 二、二叉树的遍历 遍历过程 转载自https://mp.weixin.qq.com/s/HXce4H21Gbu_O9ciXzJQYw ————深度优先遍历———— 1.前序遍历 2.中序遍历 3.后序遍历 ————广度优先遍历———— 4.层序遍历 总结:a.我们提到的四种遍历方式,其实都是在把树种的结点编程某种意义上的线性序列,这样给程序执行带来了好处。 b.前序、中序、后序遍历最根本的区别就是双亲结点的访问时机——前序是先访问双亲结点,然后左孩子,最后右孩子;中序是左孩子,双亲,右孩子;后序是左孩子、右孩子最后双亲结点。 c

面试准备 | 树相关的总结整理

前提是你 提交于 2019-12-03 21:33:19
树的遍历 前中后序遍历的6种实现方法(每种都有递归和循环两种)。 https://blog.csdn.net/liujiayu1015/article/details/52535829 剑指offer T26 34 55 7 33 (P62) 层序遍历:T32 二叉搜索树:左<根<右,O(logn)实现搜索,T36 68 堆和红黑树:堆分为最大堆和最小堆(快速查找最大、最小值)。 红黑树:把树中的节点定义为红、黑两种颜色,通过规则确保从根节点到叶节点的最长路径的长度不超过最短路径的两倍。 C++的STL基于红黑树的结构:set multiset map multimap 等 unordered_map? T40 来源: https://www.cnblogs.com/shona/p/11809684.html

PHP 高级面试115题汇总(含答案)

左心房为你撑大大i 提交于 2019-12-03 17:29:26
1、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,1],[1,0]) 能组成一个矩形。 勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和如果等于最长的,那么这就是矩形。 2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 P 点 1 /* 2 *单链表的结点类 3 */ 4 class LNode{ 5 //为了简化访问单链表,结点中的数据项的访问权限都设为public 6 public int data; 7 public LNode next; 8 } 9 10 class LinkListUtli { 11 //当单链表中没有环时返回null,有环时返回环的入口结点 12 public static LNode searchEntranceNode(LNode L) 13 { 14 LNode slow=L;//p表示从头结点开始每次往后走一步的指针 15 LNode fast=L;//q表示从头结点开始每次往后走两步的指针 16 while(fast !=null && fast.next !=null) 17 { 18 if(slow==fast) break;//p与q相等,单链表有环 19 slow=slow.next; 20 fast

两序遍历递归建立二叉树

怎甘沉沦 提交于 2019-12-03 16:59:34
前序中序遍历建立二叉树 1 Node * createTree1(string pres, string cens) { 2 if(pres.size() == 0 || cens.size() == 0) { 3 return nullptr; 4 } 5 Node * node = new Node(); 6 node->data = pres.at(0); 7 int key = cens.find(pres.at(0)); 8 9 string mpres = pres.substr(1, key); 10 string mcens = cens.substr(0, key); 11 node->left = createTree1(mpres,mcens); 12 13 mpres = pres.substr(key+1, pres.size()-key-1); 14 mcens = cens.substr(key+1, cens.size()-key-1); 15 node->right = createTree1(mpres,mcens); 16 return node; 17 }; View Code 中序后序遍历建立二叉树 后序中序遍历就是将前序中序遍历中的对前序的操作转换为对后序的操作,前序从第一个开始取,后序从后往前取。对中序操作不变 来源: https:/

静态创建二叉树及其遍历

对着背影说爱祢 提交于 2019-12-03 10:07:52
我们以这个二叉树为例 1.构造二叉树的链式存储结构 1 struct BTNode{ 2 char data; //结点数据域 3 struct BTNode * pLchild; //左孩子指针-->指向左孩子 4 struct BTNode * pRchild; //右孩子指针-->指向右孩子 5 }; View Code 2.静态的创建二叉树 struct BTNode * createBTree() { struct BTNode* pa = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pb = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pc = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pd = (struct BTNode*)malloc(sizeof(struct BTNode)); struct BTNode* pe = (struct BTNode*)malloc(sizeof(struct BTNode)); pa->data = 'A'; pb->data = 'B'; pc->data = 'C'; pd->data

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

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

C++二叉树的遍历:深度优先(前序、中序、后序)和广度优先(层次)

末鹿安然 提交于 2019-12-03 04:31:05
准备 深度优先遍历:沿着每一个分支路径进行深入访问。前序、中序、后序都是深度优先遍历的特例。可以用递归实现,非递归一般借助栈容器。 广度优先遍历:又叫层次遍历,对每一层依次访问。可以借助队列容器来实现。 先定义和创建一颗二叉树 #include <iostream> #include <vector> #include <queue> #include <stack> //定义二叉树结点 template<typename T> struct Node { T value; Node<T> *left; Node<T> *right; Node(const T &val) :value(val), left(nullptr), right(nullptr) {} Node(const T &val, Node<T> *&lnode, Node<T> *&rnode) :value(val), left(lnode), right(rnode) {} }; //创建二叉树 template<typename T> Node<T>* createBinaryTree(const std::initializer_list<T> &list) { std::vector<Node<T>*> vec; for (auto &item : list) { Node<T> *newNode =

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

江枫思渺然 提交于 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

二叉树遍历(前序、中序、后序、层次、深度优先)递归和非递归 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