完全二叉树

字节跳动移动端多媒体研发岗面试

橙三吉。 提交于 2019-12-06 17:59:46
一面 1、自我介绍 2、项目介绍 3、智能指针 4、菱形继承中父类有几份拷贝、虚继承 5、重载、重写、重定义的区别 6、多态是怎么实现的 7、构造、析构函数调用的顺序 8、static成员函数、static成员变量讲一下 9、数组和链表的区别 10、程序的内存空间。静态变量存储位置、heap和stack存储区的区别 11、数组指针、指针数组 12、B树和B+树的区别 13、香农定理 14、卷积的意义 15、还有什么问题 二面 1、自我介绍 2、项目介绍 3、视频编解码的一些基础知识 4、你觉得视频编解码还有哪些优化方向 5、PSNR的含义 6、编程题 输入完全二叉树层次遍历,将完全二叉树进行镜像,层次遍历输出 7、还有什么问题 来源: CSDN 作者: _VioletHan_ 链接: https://blog.csdn.net/VioletHan7/article/details/83382682

数据结构期末复习——树与二叉树一些知识点

限于喜欢 提交于 2019-12-05 07:43:45
满二叉树 :一棵深度为k 且有 \({2^k - 1 }\) 个结点的二叉树。(特点:每层都“充满”了结点) 完全二叉树 :深度为k 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点 一一对应 . 具有n个结点的完全二叉树的深度为log2(n)向下取整 + 1. 满二叉树和完全二叉树的区别: 满二叉树是叶子一个也不少的树 ,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例. 完全二叉树中度数为1的结点的个数为0或者为1。 在非空二叉树中,第i层的结点总数不超过 \({2^{i-1}}\) , i>=1. 深度为h的二叉树最多有 \({2^h -1}\) 个结点(h>=1),最少有h个结点. 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1; 问题 :具有1102个结点的完全二叉树的一定有___个叶子结点。 分析: 边数m=n-1,那么m = n1 + 2×n2; 而在完全二叉树中度数为1的点只有1个或0个,所以代入0或1,当n2为整数时得出n2的值, 再利用n0=n2+1可得叶子结点的个数。 来源: https://www.cnblogs.com/KeepZ/p/11914785.html

数据结构与算法之美学习笔记:第二十三讲

大憨熊 提交于 2019-12-05 00:21:43
一、课前思考 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构牛逼线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出几道思考题: 二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储? 带着这些问题,我们就来学习今天的内容,树! 二、树 1、一些节本概念 图中画了几棵“树”。你来看看,这些“树”都有什么特征? 你有没有发现,“树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫作“节点”;用来连线相邻节点之间的关系,我们叫作“父子关系”。 比如下面这幅图: A节点就是B节点的 父节点 ,B节点是A节点的 子节点 。 B、C、D这三个节点的父节点是同一个节点,所以它们之间互称为 兄弟节点 。 我们把没有父节点的节点叫作 根节点 ,也就是图中的节点E。 我们把没有子节点的节点叫作叶子节点或者 叶节点 ,比如图中的G、H、I、J、K、L都是叶子节点。 2、高度深度和层 除此之外,关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的: 这三个概念的定义比较容易混淆,描述起来也比较空洞。我举个例子说明一下,你一看应该就能明白。 记这住个概念,我还有一个小窍们,就是类比

【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

前提是你 提交于 2019-12-04 20:51:38
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢。 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点都只有有限个子节点或无子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树里面没有环路(cycle) 1.2常见术语 节点的度 :一个节点含有的 子树的个数 称为该节点的度; 树的度 :一棵树中,最大的节点度称为树的度; 叶节点 或 终端节点 :度为零的节点; 非终端节点 或 分支节点 :度不为零的节点; 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点 或 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的 层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 深度 :对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0; 高度 :对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

初识树与二叉树(基本知识讲解与常见实现)

你。 提交于 2019-12-04 03:56:58
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

树和二叉树一篇就搞定!

[亡魂溺海] 提交于 2019-12-04 03:42:46
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

可并堆之左偏树浅谈

白昼怎懂夜的黑 提交于 2019-12-03 05:02:50
左偏树是用来快速地合并堆的 正常的堆是一颗完全二叉树,我们用笨方法去合并它: 假设我们要将x和y这两个小根堆合并,我们判断一下如果x的堆顶大于y的堆顶,就交换一下x和y,然后继续合并x的某个子孩子和y。 堆被人们所推广的原因就是因为它的时间复杂度比较稳定,根本原因是堆是一颗完全二叉树 但显然的:这样合并堆并没有保证时间复杂度,也就是说没有维护完全二叉树的形态; 这时候解决的办法之一便是利用左偏树; 它比普通的堆多了一个性质:向左偏; 注意,这里的向左偏并不是指子树的大小向左偏,而是最大深度向左偏; 为了方便我们理解,我们引入一下几种概念: 我们这里定义一个值,叫做"根值",一个节点的根值就是它到最近的叶子节点的距离; 我们保证,任意一个节点的左儿子的根值大于等于右儿子的根值; 这样我们会得到一个性质: 一个n个节点的左偏树距离最大为 log(n+1)−1 简易论证:    若左偏树的根值为一定值,则节点数最少的左偏树是完全二叉树    若一棵左偏树的距离为k,则这棵左偏树至少有2^ (k+1)-1个节点; 这样做的时间复杂度是O(logn),我们可以接受;(并且没用STL,常数也很小) 为了更加的优化程序,我们可以使用路径压缩来快速找到每个元素属于哪个根 #include <bits/stdc++.h> #define inc(i,a,b) for(register int i=a

判断是否是完全二叉树

匿名 (未验证) 提交于 2019-12-02 23:43:01
2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树; bool check(BiTree T) { if (T == NULL) return false; queue<BiTree> Q; Q.push(T); while (!Q.empty()) { BiTree p = Q.front(); Q.pop(); if (p->left && p->right) { Q.push(p->left); Q.push(p->right); } else if(p->right && p-left == NULL) return false; else { if(p->left && p-right == NULL) Q.push(p->left); while(!Q.empty()) { p = Q.front(); Q.pop(); if(p->left || p->right) return false; } } } return true; }

二叉树的存储结构

匿名 (未验证) 提交于 2019-12-02 23:43:01
二叉树是非线性结构,即每个数据结点至多只有一个前驱,但可以有多个后继。它可采用顺序存储结构和链式存储结构。 二叉树有两种存储结构:   顺序存储结构;   链式存储结构:     二叉链式结构     三叉链式结构(包含父节点) 常用链式存储结构 1. 顺序存储结构 二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号,缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点存储空间。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。图5-5(a)是一棵完全二叉树,图5-5(b)给出的图5-5(a)所示的完全二叉树的顺序存储结构。 (a) 一棵完全二叉树 (b) 顺序存储结构 图5-5 完全二叉树的顺序存储示意图 对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点

堆排序

若如初见. 提交于 2019-12-02 06:12:20
堆排序 什么是堆? 堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆 或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 如下图所示: 那么话又说回来了,什么是完全二叉树呢? 要想知道什么是完全二叉树,首先得知道什么满二叉树。 满二叉树 :高度为h,并且由 2^h-1个结点的二叉树,被称为满二叉树,其实不难看出,满二叉树的结点的度要么为0(叶子结点),要么为2(非叶子结点) 完全二叉树 :一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。 特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。 堆与一维数组的映射关系 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 简单的说对于二叉树中的任意一个节点,假设它的下标为i,那么它左孩子的节点在数组中的下标就是2i+1,而其左孩子节点的下标就是2i+2 因此对于大顶堆来说满足一下的条件: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 对于小顶堆来说满足 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 来源: