完全二叉树

二叉树

旧巷老猫 提交于 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 普通树 由树的定义可以看出,树的定义使用了递归的方式。递归在树的学习过程中起着重要作用

数据结构·堆

喜夏-厌秋 提交于 2019-11-29 00:47:29
堆 堆就是一种利 用完全二叉树 来维护数据的一种数据结构,而当我们实际使用时使用数组来存储时,树中节点与数组中的值 相对应 ,也就是可以灵活运用 完全二叉树 的性质通过数组下标来维护堆。 想看Stl模板的堆请直达底部 为什么要选择堆? 堆的功能就是保持堆顶的元素最大/最小,本质上是一种 排序算法 ,为什么不用 Sort 呢?它构建时间一般是复杂度是 \(O(n)\) ,而维护的时间复杂度是 \(O(\log_2N)\) ,如果你用 Sort 进行排序,时间复杂度是 \(O(N\log_2N)\) ,两者对比,明显堆的时间复杂度 优于Sort 。 但是特殊情况特殊考虑,针对不同题目仍需要使用不同的做法 前置技能点:完全二叉树 何为完全二叉树? 如果一棵深度为K二叉树,1至k-1层的结点都是满的,即满足2i-1,只有最下面的一层的结点数小于2i-1,并且最下面一层的结点都集中在该层最左边的若干位置,则此二叉树称为完全二叉树。 简单来说就是假设一颗树的深度为h,除了最后一层每个节点都有 两个子节点 ,最后一层的结点必须 从左向右 连续出现。 什么是从 从左向右连续出现 ?如图,a就是 完全 二叉树,而b不是 完全 二叉树 此外,如果将完全二叉树按照 从上至下 , 从左至右 的次序对节点进行编号,则编号为i的节点有以下性质。 若 \(i\leq\lfloor n/2\rfloor\) 1

堆排序

谁都会走 提交于 2019-11-28 23:54:18
堆,完全二叉树 满二叉树属于完全二叉树。 不是满二叉树,新的一层从做往右依次补齐。属于完全二叉树。 堆可以用数组实现。可以把一个数组理解为完全二叉树。 给出一个数组,可以在逻辑上脑补出一个完全二叉树。0 的父节点还是自己。(特殊节点) 某个节点:i 左孩子:2 * i +1 右孩子:2 * i + 2 父节点:(i-1)/ 2 堆-是撒东西 大根堆——>就是完全二叉树,在这颗完全二叉树中,任何子树的最大值,都是头部。 小根堆——>就是完全二叉树,在这颗完全二叉树中,任何子树的最小值,都是头部。 问题来了:怎么用数组,变成大根堆? heapinsert 你已经形成一个堆,要加入一个新的节点,你要经历向上依次比对,这个值要足够大,就往上跑,跑到一个你不比父节点大的时候,你就停。这个过程就是 heapinsert 过程。-- 这就是形成大根堆的过程。 heapify 一个大根堆,假设数组中有个数变小了,怎么重新调整成大根堆? 这个变化的值,找到他左右两个孩子中最大的值,该最大值比变化的值大,和他交换。 当整个完全二叉树是整个数组时,整个 heapsize 就是数组大小。 但也有可能 0 ~ i 范围形成二叉树。堆最大的情况可能是整个数组大小,整个数组从 0~i 这一段才是堆。于是给了他一个参数,heapsize ,是代表堆上一共有多少个数?一定不会比数组的个数大。 如果有越界

数据结构·堆

孤人 提交于 2019-11-28 22:53:58
堆 堆就是一种利 用完全二叉树 来维护数据的一种数据结构,而当我们实际使用时使用数组来存储时,树中节点与数组中的值 相对应 ,也就是可以灵活运用 完全二叉树 的性质通过数组下标来维护堆。 前置技能点:完全二叉树 何为完全二叉树? 如果一棵深度为K二叉树,1至k-1层的结点都是满的,即满足2i-1,只有最下面的一层的结点数小于2i-1,并且最下面一层的结点都集中在该层最左边的若干位置,则此二叉树称为完全二叉树。 简单来说就是假设一颗树的深度为h,除了最后一层每个节点都有 两个子节点 ,最后一层的结点必须 从左向右 连续出现。 什么是从 从左向右连续出现 ?如图,a就是 完全 二叉树,而b不是 完全 二叉树 此外,如果将完全二叉树按照 从上至下 , 从左至右 的次序对节点进行编号,则编号为i的节点有以下性质。 若 \(i\leq\lfloor n/2\rfloor\) 1 ,即 \(2i\leq n\) ,则编号为i的节点为 分支节点 2 ,否则为 叶子节点 3 。 若n为 奇数 ,则树中每个分支节点即有左子节点,又有右子节点; 若n为 偶数 ,则编号最大的分支节点(编号为n/2)只有左子节点,没有右子节点 若编号为i的节点有左子节点,则左子节点的编号为 \(2i\) ;若编号为i的节点有右子节点,则右子节点编号为 \(2i+1\) 。 除树根节点外,若一个节点的编号为 \(i\)

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

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

二叉树基础知识

非 Y 不嫁゛ 提交于 2019-11-28 05:55:32
二叉树基础知识 1. 树定义 树(Tree) 是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中: 1)有且仅有一个特定的称为根(Root)的结点; 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。 ​ 3)每一棵树有且只有一个根节点,子节点没有限制,但是每个节点都互不相交。 上图就是一个普通的数。 2. 树相关概念 ​ 2.1节点的度 ​ 节点的度就是节点拥有的子树的数目。上图A的节点的度为2。 ​ 2.2树的深度 ​ 树的深度就是树中节点的最大层次树。上图树的深度为4。 ​ 2.3节点关系 ​ 树只有一个根节点,其余的为树的孩子节点。分布在根节点的左边的节点称为左孩子,右边为右孩子,左右孩子在同一层次上称为兄弟节点。而根节点即为孩子节点的双亲节点。 3. 二叉树 ​ 二叉树定义 :二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。 以上即为一颗普通的二叉树。 二叉树特点 :1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。 2)左子树和右子树是有顺序的,次序不能任意颠倒。 3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。 二叉树性质 : 1

【数据结构】-java 完全二叉树的创建以及递归遍历算法实现

 ̄綄美尐妖づ 提交于 2019-11-27 02:22:39
文章中主要 用java实现完全二叉树的创建以及二叉树的递归遍历算法 。 重点在于 完全二叉树的创建 ,递归算法比较容易些。 完全二叉树的创建 创建之前首先要了解完全二叉树的一些 性质 。 性质 :如果有一颗有n个节点的完全二叉树的节点按层次序编号,对任一层的节点i(0<=i<=n)有(注意i的取值) 1.如果i=0,则节点是二叉树的根,无双亲,如果i>0,则其双亲节点为[i/2],向下取整 2.如果2i+1>n那么节点i没有左孩子,否则其左孩子为2i+1 3.如果2i+2>n那么节点没有右孩子,否则右孩子为2i+2 结点创建 //单独一个类创建结点 public class BTNode { //定义一个二叉树的结点 private int data; private BTNode lchild; private BTNode rchild; //主要是为了构造函数的初始 public BTNode(){ } //新的构造函数,其实也可以简写 public BTNode(int data ,BTNode lchild ,BTNode rchild){ this.data=data; this.lchild=lchild; this.rchild=rchild; } //以下就是data lchild rchild的set,get函数 public void setdata(int