叶子结点

数据--第32课 -二叉树的定义

女生的网名这么多〃 提交于 2019-11-27 00:04:43
第32课 -二叉树的定义 1. 通用树结构的回顾 通用树结构是采用双亲孩子表示法模型建立的,每个结点都有一个指向其双亲的指针;每个结点都有若干个指向其孩子的指针。 2. 另一种模型 孩子兄弟表示法模型:每个结点都有一个指向其第一个孩子的指针;每个结点都有一个指向其第一个右兄弟的指针。 3. 孩子兄弟表示法 每个结点包含一个数据指针和两个结点指针:数据指针-指向保存于树中的数据;孩子结点指针-指向第一个孩子;兄弟结点指针-指向第一个右兄弟。 4. 孩子兄弟表示法的特点 能够表示任意的树形结构。 每个结点中有且仅有三个指针域:数据指针,孩子结点指针,兄弟结点指针。 每个节点的结构简单:只有孩子结点指针和兄弟结点指针构成了“树杈”。 5. 二叉树的定义 二叉树是由n(n>=0)个结点组成的有限个集合,该集合或者为空,或者是由一个根节点加上两颗分别称为左子树和右子树的互不交叉的二叉树组成。 6. 特殊的二叉树 定义1:满二叉树(Full Binary Tree) 如果二叉树中所有分支结点的度数都为2,且叶子结点都在同一层次上,则称这类二叉树为满二叉树。 定义2:完全二叉树(Complete Binary Tree) 如果一棵具有n个结点的高度为k的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1-n的结点一一对应对应,则称这棵二叉树为完全二叉树。(从上到下从左到右编号)

LeetCode Lect7 堆及其应用

浪子不回头ぞ 提交于 2019-11-26 23:36:28
概述 堆是一颗完全二叉树。分为大根堆(父节点>=所有的子节点)和小根堆(父节点<=所有的子节点)。 插入、删除堆顶都是O(logN),查询最值是O(1)。 完全二叉树(Complete Binary Tree) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 若一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。 完全二叉树的特性:对于结点t,t/2为它的父节点,2*t、2*t+1为它的子节点。所以可以直接用一个线性的数组存放堆。 堆的基本操作 :(以小根堆为例) 1.堆元素上移:和自己的父节点比较,若满足条件则交换。再次比较。 void up(int x) { int p,q; p=x; while (p/2>=1) { q=p/2; if (a[q]>a[p]) swap(&a[p],&a[q]); else break; p=q; } } 2.堆元素下移:和自己的子节点中更满足条件(更大or更小)的一个比较,若满足条件则交换。再次比较。

自古美人都是妖i 提交于 2019-11-26 21:13:54
概述   堆是一种完全二叉树,分为两种类型:      大顶堆 :每一个非叶子结点均不小于其孩子结点。      小顶堆 :每一个非叶子结点均不大于其孩子结点。      堆中根结点的位置称为 堆顶 ,最后结点的位置称为 堆尾 ,结点个数称为 堆长度 。由于结点从1开始编号,所以堆尾的结点编号等于其堆长度。   堆有以下特性:     a.对于大顶堆,堆顶元素是最大值。对于小顶堆,堆顶元素是最小值。     b.对于大顶堆,堆顶的左右孩子结点中元素值较大的为第二大值。对于小顶堆,堆顶的左右孩子结点中元素值较小的为第二小值。   堆的特性常被用于实现排序。 堆   堆常用的操作有:      插入 :在堆尾后插入新结点。      修改 :修改某个结点的元素值,然后调整堆结构。      删除 :将某个结点与堆尾交换,然后删除堆尾,最后调整堆结构。   堆接口的定义如下: 1 /** 2 * 堆 3 */ 4 public interface Heap<E extends Comparable<E>> { 5 6 /** 7 * 堆类型 8 */ 9 enum Tag { 10 /** 11 * 大顶堆 12 */ 13 GREAT, 14 15 /** 16 * 小顶堆 17 */ 18 LESS; 19 } 20 21 /** 22 * 添加结点 23 * @param e 24

二叉查找树

喜欢而已 提交于 2019-11-26 18:33:42
一、定义   二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉查找树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③左、右子树本身又各是一棵二叉查找树。   上述性质简称二叉查找树性质(BST性质),故二叉查找树实际上是满足BST性质的二叉树。 二、特点   由BST性质可得:   (1) 二叉查找树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。   (2) 二叉查找树中,各结点关键字是惟一的。注意:实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉查找树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于"改为"小于等于",甚至可同时修改这两个性质。   (3) 按中序遍历该树所得到的中序序列是一个递增有序序列。如下图所示的两棵树均是二叉查找树,它们的中序序列均为有序序列:2,3,4,5,7,8。          三、插入运算   在二叉查找树中插入新结点,要保证插入后仍满足BST性质。其插入过程是: (a)若二叉查找树T为空,则为待插入的关键字key申请一个新结点,并令其为根; (b)若二叉查找树T不为空,则将key和根的关键字比较:   (i

二叉树的前中后和层序遍历详细图解(递归和非递归写法)

断了今生、忘了曾经 提交于 2019-11-26 17:54:53
我家门前有两棵树,一棵是二叉树,另一棵也是二叉树。 遍历一棵二叉树常用的有四种方法,前序(PreOrder)、中序(InOrder)、后序(PastOrder)还有层序(LevelOrder)。 前中后序三种遍历方式都是以根节点相对于它的左右孩子的访问顺序定义的。例如根->左->右便是前序遍历,左->根->右便是中序遍历,左->右->根便是后序遍历。 而层序遍历是一层一层来遍历的。 树的前中后序遍历是个递归的定义,在遍历到根节点的左/右子树时,也要遵循前/中/后序遍历的顺序,例如下面这棵树: 前序遍历:ABDECFG 中序遍历:DBEAFCG 后序遍历:DEBFGCA 层序遍历:ABCDEFG 树的结点结构体声明如下: 语言:C语言(为了省事用到了C++的栈,因为C语言要用栈的话要自己重新写一个出来,就偷了个懒) 编译器:VS typedef char DataType; typedef struct TreeNode{ DataType data; struct TreeNode *left; struct TreeNode *right; }TreeNode; 1 2 3 4 5 6 7 前序遍历(先序遍历) 对于一棵树的前序遍历,递归的写法是最简单的(写起来),就是将一个大的问题转化为几个小的子问题,直到子问题可以很容易求解,最后将子问题的解组合起来就是大问题的解。

Dp test solution

谁说我不能喝 提交于 2019-11-26 16:40:22
Dp test solution 按照难易程度排序题解; Problem B Problem Description Tarzan 现在想要知道,区间 [L,R] 内有多少数是优美的。我们定义一个数是优美的,这个数字要满足在它 C 进制下的各位数字之和可以整除这个数字本身。 Tarzan 不会做这道题,他希望你能帮他求出这个问题的答案。 Input format 第一行三个十进制正整数 L,R,C, L 和 R 给的是十进制形式 Output format 一行一个整数表示被认为优美的数的数量 Examples input 1 output 1 5 15 10 7 input 2 output 2 2 100 2 29 Constrains and Notes 对于 30% 的数据满足: R - L ≤ 100000 对于另外 10% 的数据满足: C = 2 对于另外 20% 的数据满足: C = 10 对于 100% 的数据满足: 1 ≤ L ≤ R ≤ 10^18; 2 ≤ C ≤ 15 然后这道题是据说最简单的数位dp (但是我写炸了,只拿了暴力30 反正我太难了; 大致的思路: 如果一味枚举数字的话,我们没有办法边求边取模,从而不能很好的设计状态。因此我们需要考虑优化: 我们可以注意到一个数的数字之和是很小的,那么我们可以枚举这个数字之和sum

僤鯓⒐⒋嵵緔 提交于 2019-11-26 14:59:23
一、基本概念 度: 结点拥有的子树数目。 树的度: 各结点度的最大值。 树的深度(高度): 树中结点的最大层次(根为第一层) 二、树的存储结构 顺序存储:双亲表示法 链式存储:1.孩子表示法 2.孩子兄弟表示法( 第一个孩子、右兄弟 ) 三、二叉树 1.二叉树的性质 (1)第i层最多2^(i-1)个结点 (2)深度为k的二叉树最多2^k-1个结点 (3)叶子结点数=度为2的结点树+1 (4)n个结点的完全二叉树的深度为不大于logn+1 (5)结点按层序对照满二叉树编号: 结点i=1,则结点为根,i>1则双亲为不大于i/2; 2i>n则i无左孩子,否则左孩子是2i; 2i+1>n则i无右孩子,否则右孩子为2i+1 2.分类 斜树:所有结点都只有左子树(左斜树)或右子树(右斜树)。 满二叉树:所有结点都有左右子树,并且叶子结点都在同一层。 完全二叉树:结点按层序对照满二叉树编号连续。 3.存储 顺序存储:一般只用于完全二叉树 链表存储: 二叉链表:一个数据域+两个指针域 三叉链表:数据域+三个指针域(左、右孩子、双亲) 4.树的遍历 前序、中序、后序、层序 1: template < class T> 2: TreeNode<T> * Tree<T>::SearchParent(TreeNode<T> * &root, TreeNode<T> * &s) 3: { 4: if

树-二叉查找树

前提是你 提交于 2019-11-26 14:58:23
二叉查找树,二叉搜索树,Binary Search Tree 二叉查找树性质:左孩子<双亲<右孩子 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意节点的左、右子树也分别为二叉查找树。 没有键值相等的节点 (no duplicate nodes)。 二叉查找树插入与删除 插入 1.若当前的二叉查找树为空,则插入的元素为根节点; 2.若插入的元素值小于根节点值,则将元素插入到左子树中; 3.若插入的元素值不小于根节点值,则将元素插入到右子树中。 删除 分三种情况进行处理: 1.p为叶子节点。 直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点)。 2.p为单支节点(即只有左子树或右子树)。 让p的子树与p的父亲节点相连,删除p即可(注意分是根节点和不是根节点)。 3.p的左子树和右子树均不空。 (找后继,次大值):找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值; 二叉查找树实现 //BSTree.h #ifndef BSTREE_HXX #define BSTREE_HXX #include <iostream> using namespace std; template <class T> class

【NOI2015】荷马史诗

与世无争的帅哥 提交于 2019-11-26 14:12:43
   题目链接 https://www.luogu.org/problem/P2168    题目大意 是给定 n 个单词 的出现次数 wi ,求用 k 进制的前缀码转换后得到的最小总长度,以及在保证总长度最小时的最长串 si 的长度最短。   这题现在来看算是NOI里很简单的了(我竟然凹出来了w),但是据说当时这题可是难倒一大片。首先是因为这题题干太长不怎么容易看懂,另外可能是因为当时哈弗曼树还没有那么常见,几乎没人想到有哈弗曼树这么一个东西。   好,来看题。题目很明确,目标是要使编码之后的总长度最小,那么现在就要想着,怎样把出现次数多的编码长度尽可能的缩小。但是题目里有个限制:任意一个k进制编码都不是其它编码的前缀。这样一来,题目的做法就指向了哈弗曼树。    哈弗曼树与哈夫曼编码    这里简单重复一下 ——(证明过程引用自耿国华主编的《数据结构——C语言描述》)   哈夫曼树特性:从根结点到所有叶子结点的带权路径长度最短(就是权大的放靠近树根的地方)   做法:挑选序列里最小的2个点合并作为子节点,根节点的权值为他们的和,把根节点加入原序列,重复上述操作。   哈夫曼编码特性:1.它是前缀码。前缀码就是题目里给的那种,任何一个编码都不是其它编码的前 t 项。 证明:哈夫曼编码是根到叶子路径上的边的编码序列,也就是等价边序列,而由树的特点可知

数据结构(树与二叉树)

做~自己de王妃 提交于 2019-11-26 12:29:34
一、定义 树是n(n≥0)个结点的有限集合,n=0时,称为空树。(它是一种一对多的逻辑结构) 而对任意非空树应该满足: 1)有且仅有一个特定的称为根的结点。 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,称为根结点的子树。 (其中A为根节点。BEF为根节点A的其中一个子树。) 观察可知树有以下两个特点: 1。树的根节点没有前驱结点,除根节点外的所有结点有且只有一个前驱结点。 2。树中所有结点可以有零个或多个后继结点 (重要结论:n个结点的树中只有n-1条边。) 二、基本术语 1)祖先结点和子孙结点 、双亲结点和孩子结点、兄弟结点 由根节点出发为了找到K,所经过的路径为: ABEK因此E、B、A均为K的祖先结点,而K为A、B、E的子孙结点 。看这样一个子树EKL,在这个子树中 K、L为E的孩子结点,而E为K、L的双亲结点,且K与L互为兄弟结点。 2)度 树中一个结点的子节点的个数称为该结点的度(如A、D的度为3,B、E的度为2,C的度为1,而F、G、H、I、J、K、L的度为0),而树中的最大度数称为树的度(容易看出该树的度为3) 3)分支结点与叶子结点 度大于0的结点称为分支结点,而度为0的结点称为叶子结点。(如A、B、C、D、E均为分支结点而F、G、H、I、J、K、L均为叶子结点。) 4)结点的层次、高度、深度 结点的层次