前序遍历

二叉树

旧巷老猫 提交于 2019-11-29 05:11:54
前言 树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。一直以来,对于树的掌握都是模棱两可的状态,现在希望通过写一个关于二叉树的专题系列。在学习与总结的同时更加深入的了解掌握二叉树。本系列文章将着重介绍一般二叉树、完全二叉树、满二叉树、 线索二叉树 、 霍夫曼树 、 二叉排序树 、平衡二叉树、红黑树、B树。希望各位读者能够关注专题,并给出相应意见,通过系列的学习做到心中有“树”。 1 重点概念 1.1 结点概念 结点是数据结构中的基础,是构成复杂数据结构的基本组成单位。 1.2 树结点声明 本系列文章中提及的结点专指树的结点。例如:结点A在图中表示为: 2 树 2.1 定义 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中: 1)有且仅有一个特定的称为根(Root)的结点; 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。 此外,树的定义还需要强调以下两点: 1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点。 2)m>0时,子树的个数没有限制,但它们一定是互不相交的。 示例树: 图2.1为一棵普通的树: 图2.1 普通树 由树的定义可以看出,树的定义使用了递归的方式。递归在树的学习过程中起着重要作用

二叉树遍历(非递归版)——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 深度优先遍历 思想 :利用 栈 ,先将根入栈,再将根出栈

二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解

巧了我就是萌 提交于 2019-11-28 17:44:27
0. 写在最前面 复习到二叉树,看到网上诸多博客文章各种绕,记得头晕。个人觉得数学、算法这些东西都是可以更直观简洁地表示,然后被记住的,并不需要靠死记硬背。 本文的程序基本来源于《大话数据结构》,个人感觉是一本非常好的书,推荐去看。 1. 为什么叫前序、后序、中序? 一棵二叉树由根结点、左子树和右子树三部分组成,若规定 D、L、R 分别代表遍历根结点、遍历左子树、遍历右子树,则二叉树的遍历方式有 6 种:DLR、DRL、LDR、LRD、RDL、RLD。由于先遍历左子树和先遍历右子树在算法设计上没有本质区别,所以,只讨论三种方式: DLR--前序遍历(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 ) LDR--中序遍历(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面) LRD--后序遍历(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面) 需要注意几点: 1 根是相对的,对于整棵树而言只有一个根,但对于每棵子树而言,又有自己的根。比如对于下面三个图,对于整棵树而言,A是根,A分别在最前面、中间、后面被遍历到。而对于D,它是G和H的根,对于D、G、H这棵小树而言,顺序分别是DGH、GDH、GHD;对于C,它是E和F的根,三种排序的顺序分别为: CEF、ECF、EFC。是不是根上面的DLR、LDR、LRD一模一样呢~~ 2

别再翻了,面试二叉树看这 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: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 09:56:21
项目工程文件:(包括节点类Node.java 接口类MyBTreeInterface.java 二叉树类MyBTree.java 和测试类MyBTree_test_1.java) Node.java 1 /* 2 二叉树的结点类 3 */ 4 public class Node { 5 public Object obj; 6 public Node leftNode; 7 public Node rightNode; 8 //构造方法 9 10 public Node(Object obj) { 11 this.obj = obj; 12 } 13 public Node(Object obj, Node leftNode, Node rightNode) { 14 this.obj = obj; 15 this.leftNode = leftNode; 16 this.rightNode = rightNode; 17 } 18 19 @Override 20 public String toString() { 21 return "Node{" + 22 "obj=" + obj + 23 ", leftNode=" + leftNode + 24 ", rightNode=" + rightNode + 25 '}'; 26 } 27 } 接口类

java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

大兔子大兔子 提交于 2019-11-28 08:05:21
介绍 深度优先遍历: 从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。 广度优先遍历: 从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。 DFS实现: 数据结构:栈 父节点入栈,父节点出栈,先右子节点入栈,后左子节点入栈。递归遍历全部节点即可 BFS实现: 数据结构:队列 父节点入队,父节点出队列,先左子节点入队,后右子节点入队。递归遍历全部节点即可 树的实现 public class TreeNode<V> { private V value; private List<TreeNode<V>> childList;//子节点列表 public TreeNode(V value) { this.value = value; } public TreeNode(V value, List<TreeNode<V>> childList) { this.value = value; this.childList = childList; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } public List<TreeNode<V>>