理论基础——树与二叉树
树、二叉树、堆
Alex_McAvoy
想要成为渔夫的猎手
展开
-
理论基础 —— 树
【树的定义】树是一种非线性的有序数据结构,能很好地描述有分支和层次特性的数据集合,其是递归定义的。一颗树是由 n(n>=0) 个元素组成的有限集合,其中:当 n=0 时,称为空树 每个元素称为结点(node)对于任何一棵非空树,满足以下条件:有且仅有一个特定的根结点 (root),其没有前驱。 除根节点外每个结点都有唯一一个前驱结点 每个结点都有 0 或多个后继结点...原创 2018-06-11 19:56:25 · 1759 阅读 · 0 评论 -
理论基础 —— 二叉树
【二叉树的定义】二叉树( binary tree)是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。二叉树的特点是:每个结点最多有两棵子树,故二叉树中不存在度大于 2 的结点 二叉树是有序的,其次序不能任意颠倒,即使树中的某个结点只有一棵子树,也要区分它是左子树还是右子树二叉树具有以下 5 种基本形态:...原创 2018-06-13 17:00:36 · 852 阅读 · 0 评论 -
理论基础 —— 堆
【堆的定义】堆结构是具备以下性质的完全二叉树:小根堆:每个结点的值都小于或等于其左右孩子结点的值 大根堆:每个结点的值都大于或等于其左右孩子结点的值若将堆按照层序从 1 开始编号,则结点间满足下列关系:小根堆: 大根堆:从堆的定义可以看出,一个完全二叉树如果是堆,那么其根结点(堆顶)一定是当前堆中所有结点的最大值(大根堆)或最小值(小根堆),以层序结点编号为下标,将堆用顺序结构...原创 2018-06-14 21:06:51 · 491 阅读 · 0 评论 -
理论基础 —— 树 —— 树的存储结构
【父亲表示法】由于树中每个结点均有且仅有一个父结点,那么根据这一特性,用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,每个结点记录两类信息:结点的数据信息、该结点的父亲在数组中的下标优缺点:利用了树中除根结点外每个结点都有唯一的父结点这个性质,很容易找到树根,但找孩子时需要遍历整个线性表template<class T>struct ...原创 2019-06-06 22:04:07 · 1724 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 顺序存储结构
【顺序存储结构】二叉树的顺序存储结构是用一维数组存储二叉树中的结点,并用结点的存储位置表示结点间的逻辑关系(父子关系)由于二叉树本身不具有顺序关系,因此二叉树的顺序存储结构要解决的关键问题是如何利用数组下标来反映结点间的逻辑关系。由于完全二叉树中结点的层序编号可以唯一反映结点间的逻辑关系,因此对于一般的二叉树,可以添加一些不存在的空结点,使其成为一棵完全二叉树,再利用一维数组存储。...原创 2019-06-09 15:58:49 · 6360 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 二叉树的遍历
【递归遍历】以二叉链表的存储结构为例1.先序遍历若二叉树为空,则空操作,否则:先访问根结点,再先序遍历左子树,然后先序遍历右子树void preOrder(Node *bt){//先序遍历根结点为bt的二叉树的递归算法 if(bt==NULL) return; else{ cout<<bt->data;//输出根节点b...原创 2019-06-09 16:06:13 · 336 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 线索链表
【概述】对于一个有 n 个结点的二叉链表,每个结点指向左右孩子的两个指针域,故共有 2n 个指针域,而 n 个结点的二叉树共有 n-1 条分支,即存在 2n-(n-1)=n+1 个空指针域,白白浪费了资源。另一方面,在二叉链表上,只能知道每个结点的左右孩子结点的地址,而不知道某个结点的前驱和后继,要想知道,必须对二叉树进行遍历,以后每次想要知道时,都要遍历一次,这无疑浪费了时间。综合以...原创 2019-06-10 12:57:58 · 4202 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 三叉链表
【三叉链表】在二叉链表的存储方式下,从某结点出发可以直接访问到它的孩子结点,但要找到某个结点的父节点需要从根节点开始搜索,最坏情况下,需要遍历整个二叉链表。而三叉链表,在二叉链表的基础上加了一个指向父结点的指针域,使得即便于查找孩子结点,又便于查找父结点,但相对二叉链表而言,加大了空间开销。template<class T>struct Node{ T data...原创 2019-06-09 16:49:49 · 11809 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 二叉链表
【二叉链表】二叉树一般采用二叉链表存储,其基本思想是:令二叉树的每个结点对应一个链表结点,链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针。template<class T>struct Node{ T data;//数据域,存放该结点的信息 Node<T> *lchild;//左指针域,存放指向左孩子的指针,当左孩子不...原创 2019-06-09 16:38:31 · 20775 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 树、森林、二叉树的转换
【概述】从树的孩子兄弟表示法和二叉树的二叉链表表示可以看出,树的孩子兄弟表示法实质上是二叉树的二叉链表存储形式,第一个孩子指针和右兄弟指针分别相当于二叉链表的左孩子指针和右孩子指针。因此,从物理结构上看,树的孩子兄弟表示法和二叉树的二叉链表是相同的,只是解释不同。以二叉链表为媒介,可导出树与二叉树的对应关系,即给出一棵树,可以找到唯一的一棵二叉树与之对应,这样树的操作实现就可借助二叉树...原创 2019-06-09 16:14:33 · 492 阅读 · 0 评论 -
理论基础 —— 二叉树 —— 哈夫曼树与哈夫曼编码
【哈夫曼树】1.相关概念1)叶结点的权值:对叶结点赋予的一个有意义的数值量2)二叉树的带权路径长度(WPL):设二叉树具有 n 个带权叶结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之和即:,其中 Wk 为第 k 个叶结点的权值,Lk 为从根结点到第 k 个叶结点的路径长度如图所示,WPL=2*2+3*2+4*2+7*2=4+6+8+14=323)哈夫曼树:给...原创 2018-06-17 15:09:19 · 2511 阅读 · 0 评论