三、树和二叉树

  1、树

  2、二叉树

  3、遍历二叉树和线索二叉树

  4、赫夫曼树及应用

树和二叉树

树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱。

非空树中节点特征:

  (1)只有一个根节点,它只有直接后继,但没有直接前驱;

  (2)元素个数n>1时,其余节点可分为m个互不相交的有限集合。每一个集合本身又是一棵树,称为根的子树。子树的根节点只有一个直接前驱,可以有任意个直接后继。

基本术语

  结点:包含数据元素以及逻辑关系信息。

  结点的度:节点拥有的子树数目(0,1,2)。

  树的度:树中所有结点点的度的最大值。

  叶子节点:度为0的结点。

  分支结点:度大于0的结点。即除叶子结点外的其它结点。

  孩子结点:若结点有子树,则子树的根结点称为这个节点的孩子节点。

  双亲结点:反过来,此结点称为孩子结点的双亲结点。叶子结点没有孩子。

  结点的层次:依次加一。根结点的层次为1~

  树的高度:叶子结点所在的最大层次为树的高度,也可以称为树的深度。空树高度为0。

  兄弟结点:同一双亲的孩子结点之间互称兄弟。

  堂兄弟节点:同一层次,双亲不同的结点。

  祖先节点&子孙节点:如名字所说。

  路径:从树的一个结点到另一个结点的分支构成这两个结点之间的路径。

  有序树:如果将节点的各棵子树看成从左至右是有次序的,即子树之间存在确定的次序关系,则称该树为有序树。

  无序树:根结点的各棵子树之间不存在确定的次序关系,可以互相交换位置。

  森林:m棵不相交的树的集合构成森林。M>=0。

二叉树

二叉树是一种适合计算机处理的特殊的树,其每个结点至多只有两棵子树,并且二叉树的两棵子树有左右之分。

任何树和森林都可以转换为二叉树!!

  二叉树的性质:

  (1) 二叉树的第i层最多有2^(i-1)个结点;

  (2) 高度为k的二叉树上至多有(2^k)-1个结点;

  (3) 任意一棵二叉树,若它含有n个叶子节点,m个度为2的结点,则有n=m+1;

  引申:

  满二叉树:只含有度为0和2的结点,且度为0的结点只出现在最后一层。

  完全二叉树:对任意一棵满二叉树,从它最后一层的最右结点起,按从下到上、从右到左的次序,去掉若干个结点后,得到的二叉树。

  (4) 具有n个结点的完全二叉树的高度为[log(2)n]+1;

  (5) 若对含有n个结点的完全二叉树,按照从上到下,从左至右的次序进行1至n的编号,对完全二叉树中任意一个编号为i的结点,简称为结点i,有以下关系:

  A. i=1,结点i是二叉树的根,无双亲;若i>1,结点[i/2](向下取整)为双亲结点;

  B.  若2i>n,则结点i无左x孩子,否则结点2i为左孩子;

  C.  若2i+1>n,则结点i无右孩子,否则结点2i+1为右孩子。

  二叉树的存储结构:-

  1、  顺序存储结构

  按照结点的层次从上到下、从左至右,将完全二叉树结点存储在一片连续存储区域内。存储只保留结点的值。这样的方式,对于完全二叉树来说,非常方便,因为已知结点的编号就可以推算出它的双亲和孩子结点的编号,因此是一种很经济的存储方式。

  但是,对于一般而二叉树来说,需要补设一些虚结点。这样可能会造成很大的空间浪费。因此,一般情况下,很少使用顺序存储方式。

  2、  链式存储结构。

  链表的结点中至少包含:左孩子指针、数据元素、右孩子指针。这是二叉链表,从根结点出发可以访问到所有结点。缺点是,从某个节点出发,寻找双亲结点时,需要从根节点开始搜索,效率极低!

  为解决这个问题,可以在结点中增加一个指向双亲结点的指针,即三叉链表结构。

  实际使用中,一般还是使用二叉链表。

二叉树遍历

若规定先左后右的顺序,则只存在:DLR先序遍历、LDR中序遍历、LRD后序遍历、层次遍历。命名根据根节点被遍历的次序。

  1、  先序遍历:根—左子树—右子树

  2、  中序遍历:左子树—根—右子树

  3、  后序遍历:左子树—右子树—根

  遍历算法:递归算法很简单,非递归要复杂许多。·

遍历应用:

  1、  计算结点个数与树的高度

  2、  二叉树的销毁

  3、  二叉树的复制

  4、  二叉树的显示:可按中序遍历的算法编程实现。

  5、  由先序序列与中序序列构造二叉树

  仅仅由二叉树的先根遍历序列不能唯一确定一棵二叉树,需要在先根序列中加入空子树的信息;

  根据一棵树的先序遍历和中序遍历,或者后序遍历和中序遍历序列,都可以唯一地确定一棵树。

  6、  表达式的前缀表示、中缀表示和后缀表示

线索二叉树

按某种方式遍历二叉树,遍历所得到结果序列就变为线性结构,树中所有结点都按照某种次序排列在一个线性有序的序列中,每个结点就有了唯一的前驱和后继。

而当以二叉链表为存储结构时,只能找到结点左、右孩子信息,而不能直接得到前驱和孩子信息。高效经济的方法是利用空指针成员存放结点在某种遍历次序下的前驱或者后继指针。

哈夫曼树与哈夫曼编码

Huffman树也称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途。

路径:从树的一个结点到另一个结点的分支构成这两个结点之间的路径,对于huffman树,特指从根结点到某结点的路径。

路径长度:路径上的分支数叫做路径长度。

树的路径长度:从树根到每一个结点的路径长度之和。

权:赋予某个事物一个量,对其属性进行数值化描述。数据结构中有结点权和边权。

结点的带权路径长度:从树根到结点之间的路径长度与结点上权的乘积。

树的带权路径长度:简称WPL,树中所有叶子结点的带权路径长度之和。

哈夫曼树:根据给定的n个值w1、w2、…、wn,可以构造出多棵具有n个叶子结点且其权值分别为这n个给定值的二叉树,其中带权路径长度WPL最小的二叉树叫做最优树。

在哈夫曼树中,权值越大的结点离根节点越近。

哈夫曼算法:

由n个权值构造n个带权结点—选其中权值最小的两个结点构造一棵新树,它们分别为左右孩子—删除这两个结点,把新树放入森林中—重复前面步骤直到只有一棵树。

Huffman编码

  思考:在已知传输的字符集合及其出现频度的情况下,是否可得到更有效的编码使得传输的编码长度达到最短呢?

  为了缩短编码总长度,可采用不定长编码。

  前缀码:一个编码系统中,任一个编码都不是其他任何编码的前缀,则称此编码系统中的编码是前缀码。

  哈夫曼编码就是利用哈夫曼树来设计的最优前缀编码,也就是报文编码总长度最短的二进制前缀编码。利用n个字符的频率作为权值,设计一棵哈夫曼树。然后左分支赋值0,右分支赋值1。从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串。该二进制串即为对应字符的前缀编码。

  具有n个字符的报文的总编码长度就是哈夫曼树的带权路径长度,所以得到的不定长编码就是最优前缀编码。

  解码方法:根据哈夫曼树来走就行了。去一个码走一步,如果走到叶子节点就译码。

数据结构(三) 树和二叉树,以及Huffman树的更多相关文章

  1. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  3. 数据结构之Huffman树与最优二叉树

    最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式 ...

  4. 【C#数据结构系列】树和二叉树

    线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...

  5. [数据结构] 2.2 Huffman树

    注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. 1.Huffman树是什么 Huffman树也称为哈夫曼编码,是一种编码方式,常用于协议的制定,以节省传输空间. A - F字母,出 ...

  6. 数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树

    6.5 Huffman 树 Huffman 树又称最优树,可以用来构造最优编码,用于信息传输.数据压缩等方面,是一类有着广泛应用的二叉树. 6.5.1 二叉编码树 在计算机系统中,符号数据在处理之前首 ...

  7. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  8. 数据结构(C语言版)-第5章 树和二叉树

    5.1  树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m& ...

  9. java实现哈弗曼树和哈夫曼树压缩

    本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...

随机推荐

  1. $\LaTeX$数学公式大全13

    $13\ Text\ Mode:\ Accents\ and\ Symbols$ $\AA$ \AA $\S$ \S

  2. 「CTSC 2008」祭祀

    题目链接 戳我 \(Solution\) 第一问 这道题要知道一个叫做\(Dilworth\)的定理 最长反链\(=\)最小链覆盖 证明(\(from\ r\_64\)): 所以我们只要求一个最小链覆 ...

  3. Leetcode题目20.有效的括号(简单)

    题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符 ...

  4. boost1.59编译安装

    boost 1.59.0编译及使用 1.下载: 网址:http://sourceforge.net/projects/boost/files/boost/1.59.0/ 选择:boost_1_59_0 ...

  5. PHP 验证5-20位数字加字母的正则(数字和字母缺一不可)!!!

    $pattern = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,20}$/'; if(!preg_match($pattern,$username)){ re ...

  6. DAY 6考试

    题解: 这题太水辣 注意开 long long 但我不是没开long long 的锅 我是 输出 long long 要用 lld 啊 大梦身先醒,80可海星 PS:百度了一下 long (ld) 和 ...

  7. js 中文字符串转base64

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 阶段3 3.SpringMVC·_07.SSM整合案例_03ssm整合之编写Spring框架

    做整合要保证每个框架单独使用 先搭建Spring的框架,然后再整合别的框架.Spring是业务层的框架 spring的配置文件 这就表示是spring的配置文件 默认的约束不够,需要修改. <b ...

  9. 使用命令行方式运行 JMeter 脚本

    For non-interactive testing, you may choose to run JMeter without the GUI. To do so, use the followi ...

  10. jq 点击除了某元素以外的其他所有元素

    $('body').click(function(e){ if(($(e.target).attr('class')!='header-top-nav-ipt')){ alert('除了class=h ...