先序遍历

【树论】求先序遍历

僤鯓⒐⒋嵵緔 提交于 2019-11-29 02:22:05
原题传送门 题目 题目描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示)。 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。 输出格式: 1行,表示一棵二叉树的先序。 思路 首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D)。 因为题目求先序,意味着要不断找根。 中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B; 那么我们找到中序遍历中的B,由这种遍历的性质,可将中序遍历分为ACGD和HZKX两棵子树, 那么对应可找到后序遍历CDGA和HXKZ(从头找即可) 从而问题就变成求1.中序遍历ACGD,后序遍历CDGA的树 2.中序遍历HZKX,后序遍历HXKZ的树; 接着递归,按照原先方法,找到1.子根A,再分为两棵子树2.子根Z,再分为两棵子树。 就按这样一直做下去(先输出根,再递归); 模板概括为step1:找到根并输出 step2:将中序,后序各分为左右两棵子树; step3:递归,重复step1,2; Code #include<cstdio> #include<iostream> #include<cstring> using namespace std; void beford(string in,string after){ if (in

数据结构--树的非递归遍历

主宰稳场 提交于 2019-11-28 22:33:42
树的递归遍历代码非常简单易懂,但是由于递归会占用非常多的栈空间,因此非递归的遍历树也是必须要掌握的。因此最近仔细分析了很多的代码以及理解了遍历的过程,最后敲一遍并在这里记录一下,以后可以快速回顾。一般来说,递归可以解决的问题也一定可以用栈加循环的方式解决,毕竟递归实质上就是利用了栈嘛。 树从根节点开始对每个结点进行遍历,每个结点必定被访问三次,如上图。 第一次碰到就访问就是先序,第二次碰到访问就是中序,第三次碰到访问就是后序。 public class Tree { public void preOrder(TreeNode t) { //先序遍历 Stack<TreeNode> s = new Stack<>(); while(t != null || !s.isEmpty()) { while(t != null) { System.out.println(t.val); //第一次碰到就访问结点 s.push(t); //压栈保存,以便左边访问完了,可以得到此结点的右节点 t = t.left; } if(!s.isEmpty()) { t = s.pop(); t = t.right; //当上述循环推出,说明左子树全访问完了,则把父结点弹出,准备访问右子树 } } } public void inOrder(TreeNode t) { //中序,与先序很像

二叉树遍历(非递归版)——python

久未见 提交于 2019-11-28 22:27:17
二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历 (breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点。 深度优先遍历( depth first traversal):对于一颗二叉树,深度优先遍历是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。深度优先遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做 先序遍历 (preorder):根节点->左子树->右子树, 中序遍历 (inorder):左子树->根节点->右子树,和 后序遍历 (postorder):左子树->右子树->根节点。这三种都是递归方式实现对一整个二叉树遍历的哦。 代码(非递归版) class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Trees: #根据前序和中序列表来重建二叉树 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre) == 0: return None if len(pre) == 1: return TreeNode(pre

面试常见二叉树算法题集锦-Java实现

亡梦爱人 提交于 2019-11-28 20:43:29
1.求二叉树的深度或者说最大深度 /* ***1.求二叉树的深度或者说最大深度 */ public static int maxDepth(TreeNode root){ if(root==null) return 0; int left=maxDepth(root.left); int right=maxDepth(root.right); return Math.max(left,right)+1; } 2.求二叉树的最小深度 /* ***2.求二叉树的最小深度 */ public static int MinDepth(TreeNode root){ if(root==null) return 0; if(root.left==null&&root.right==null) return 1; int left=MinDepth(root.left); int right=MinDepth(root.right); if(root.left==null||root.right==null) return Math.max(left,right)+1; return Math.min(left,right)+1; } 3.求二叉树中节点的个数 /* ***3.求二叉树中节点的个数 */ public static int nodeCount(TreeNode root){ if

二叉树(二叉树的性质及遍历)

☆樱花仙子☆ 提交于 2019-11-28 19:54:58
一、二叉树的性质 在二叉树的第 i 层上至多有 2 i-1 个节点。 深度为 k 的二叉树至多有 2 k -1 个节点。 对任意一棵二叉树 T ,若终端节点数为 n 0 ,而其度数为 2 的节点为 n 2 ,则 n 0 =n 2 +1。 具有 n 个节点的完全二叉树的深度为 。 二、单链表结点的存储结构描述 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkList; LinkList 和 Node * 同为结构指针类型,这两种类型是等价的。通常习惯上用 LinkList 说明指针变量,强调它是某个单链表的头指针变量。例如,使用定义 LinkList L, 则 L 为单链表的头指针,从而提高程序的可读性。用 Node* 来定义指向单链表中结点的指针,例如, Node *p, 则 p 为指向单链表中结点的指针变量。 三、二叉树的遍历方式 先序遍历:根、左、右 中序遍历:左、根、右 后序遍历:左、右、根 #include <iostream> #include <malloc.h> using namespace std; //二叉树的节点 typedef struct BiTNode { char ch;; struct BiTNode *lchild;//左孩子 struct BiTNode

二叉树及遍历总结

删除回忆录丶 提交于 2019-11-28 18:42:57
前言 由于最近一直在忙目标检测这块的项目,一直没有时间静下心来总结经典算法之一:二叉树。下面我会给大家介绍二叉树的定义以及其应用,方便大家加深对该算法的理解。 1. 二叉树 二叉树 是一种特殊的树,它具有以下 特点 : 1.树中每个节点最多只能有两棵树,即每个节点的度最多为2。    2.二叉树的子树有左右之分,即 左子树 与 右子树 ,次序不能颠倒。    3.二叉树即使只有一个子树时,也要区分是左子树还是右子树。 2. 二叉树的遍历 以下遍历以该二叉树为例: 2.1 前序遍历 思想 :先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根—左—右.上图先序遍历结果为为:1,2,4,8,9,5,3,6,7 2.2 中序遍历 思想 :先中序访问左子树,然后访问根,最后中序访问右子树。总的来说是左—根—右,上图中序遍历结果为为:8,4,9,2,5,1,6,3,7 2.3 后序遍历 思想 :先后序访问左子树,然后后序访问右子树,最后访问根。总的来说是左—右—根,上图后序遍历结果为为:8,9,4,5,2,6,7,3,1 2.4 层次遍历(宽度优先遍历) 思想 :利用 队列 ,依次将根,左子树,右子树存入队列,按照 队列 的 先进先出 规则来实现层次遍历。上图后序遍历结果为为:1,2,3,4,5,6,7,8,9 2.5 深度优先遍历 思想 :利用 栈 ,先将根入栈,再将根出栈

别再翻了,面试二叉树看这 11 个就够了~

此生再无相见时 提交于 2019-11-28 14:29:22
写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github。欢迎关注和 star: 「 数据结构与算法仓库 」 PS:如果你刚刚在学习数据结构和算法,请务必把最简单的题弄懂,所有的入门的数据结构与算法从简单到复杂进行了全面的梳理。 「 初学者必会的 30 道数据结构与算法 」 如果你对数据结构和算法有了一定的了解和认识,上边的入门算法题已经可以轻松实现,那么可以尝试着解决 LeetCode 上总结的 30 道题,我把解题思路、测试用例、代码实现做了详细的整理,建议先自己尝试的解决哦,收藏 + 关注,欢迎 Star。「 必会的 30 道 LeetCode 经典算法题 」 如果你正在面试,经典的《剑指offer》所有的面试代码实现 (JavaScript 版)放在 Github 仓库,可自行查看。Github 地址「 剑指 offer 所有题目 JavaScript 版解题思路、总结、代码测试。✍️✍️✍️ 」 网络协议原理: 除了算法之外

二叉树的实现

孤人 提交于 2019-11-28 12:44:16
二叉树的实现 1.二叉树的节点类 由于二叉树由一组节点组成,首先定义一个表示二叉树节点的类。节点通过链接引用其子节点,没有子节点时python用None表示,也就是说空二叉树直接用None表示。 下面是用python定义的二叉树节点的类: 1 class BinTreeNode: 2 def __init__(self, data, left=None, right=None): 3 self.data = data 4 self.left = left 5 self.right = right 2.构建二叉树 通过节点信息构造二叉树第一次遍历我们构造 node 节点第二次遍历我们给 root 和 孩子赋值最后我们用 root 初始化这个类并返回一个对象 1 class BinTree(object): 2 def __init__(self, root=None): 3 self.root = root 4 5 @classmethod 6 def build_from(cls, node_list): 14 node_dict = {} 15 for node_data in node_list: 16 data = node_data['data'] 17 node_dict[data] = BinTreeNode(data) 18 for node_data in node

树和二叉树

时间秒杀一切 提交于 2019-11-28 12:24:48
---恢复内容开始--- 树的逻辑结构表示有树形结构文氏图结构和凹入表示法和括号表示法 基本术语 结点的度:最大度 树的度:结点总度: 分支结点:有后继结点的结点 叶子结点:没有后继结点的结点 孩子结点:一个结点的后继结点 双亲结点:一个结点的前驱结点 子孙结点:一个结点的子树当中除去本身的结点 祖先结点:从树根结点到达某个结点经过的所有结点,不包括本身 兄弟结点: 结点层次:根节点为第一层 树的高:最大层次 森林:有零个或者多个不交错的树 性质: 树中的结点数=树的度+1 度为m的元素 第i层最多有m^(i-1)个结点 (满树的时候根节点有m度 第i-1有m^(i-1)度该度也就是第i层的结点数) m次树也就是最大度为m 但n个结点构造树 但为m次树或者接近满m次树的时候 树的高度层数最小 /* 高度为h的m次树最多有多少个结点? m+m^2+m^3+...+m^(h-1)总度数 再加上跟结点1 就是m的h-1次阶层 也就是m^0+m^1+m^2+m^3+...+m^(h-1) */ 因为树的结构为非线性结构因此树的运算较以前讨论的线性结构复杂 主要运算有: 寻找满足某种特定关系的结点 如寻找当前结点的双亲结点等等 插入或者删除某个结点 如在当前的结点上插入一个新的结点或者删除当前结点的第i个孩子结点等 遍历树中的每个结点 主要有先根遍历、后根遍历和层次遍历三种

程序员,你心里就没点树吗?

雨燕双飞 提交于 2019-11-28 06:26:32
看官,不要生气,我没有骂你也没有鄙视你的意思,今天就是想单纯的给大伙分享一下树的相关知识,但是我还是想说作为一名程序员,自己心里有没有点树?你会没点数吗?言归正传,树是我们常用的数据结构之一,树的种类很多有二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树等等,我们今天就来聊聊二叉树相关的树。 什么是树? 首先我们要知道什么是树?我们平常中的树是往上长有分支的而却不会形成闭环,数据结构中的树跟我们我们平时看到的树类似,确切的说是跟树根长得类似,我画了一幅图,让大家更好的理解树。 图1、图2都是树,图3不是树。每个红色的圆圈我们称之为元素也叫节点,用线将两个节点连接起来,这两个节点就形成了父子关系,同一个父节点的子节点成为兄弟节点,这跟我们家族关系一样,同一个父亲的叫做兄弟姐妹,在家族里面最大的称为老子,树里面也是一样的,只是不叫老子,叫做跟节点,没有子节点的叫做叶子节点。我们拿图1来做示例,A为根节点,B、C为兄弟节点,E、F为叶子节点。 一颗树还会涉及到三个概念 高度 、 深度 、 层 ,我们先来看看这三个名词的定义: 高度 :节点到叶子节点的最长路径,从0开始计数 深度 :跟节点到这个节点所经历的边数,从0开始计数 层 :节点距离根节点的距离,从1开始计数 知道了三个名词的概念之后,我们用一张图来更加形象的表示这三个概念。 以上就是树的基本概念,树的种类很多