九、二叉树和霍夫曼树

一、二叉树的深层性质

性质1
在二叉树的第 i层最多有 2^(i-1)个结点 。 (i≥1)
?第一层最多有 2-1=1个结点
?第二层最多有 2^(2-1)=2个结点
?第三层最多有 2^(3-1)=4个结点
性质2
深度为 k 的二叉树最多有 2^k -1个结点 。 (k ≥ 0)
?如果有一层 ,最多有 1=2- 1=1 个结点
?如果有两层 ,最多有 1+2=2^2- 1=3 个结点
?如果有三层 ,最多有 1+2+4=2^3 -1=7个结点
性质3
对任何一棵二叉树 , 如果其叶结点有 n0个 , 度为2的非叶结点有n2个, 有 则有
?n0=n2+1
性质4
具有n个结点的完全二叉树的高度为[log2 n]+ 1 。 ([X]表示不大于 X 的最大整数)
性质5
一棵有 n个结点的二叉树 ( 高度为[log2 n]+ 1), 按层次对结点进行编号( 从上到下 , 从左到右 ),对任意结点 i 有 :
?如果 i = 1 , 则结点 i 是二叉树的根
?如果 i > 1 , 则其双亲结点为 [ i/2]
?如果 2i <= n ,则结点 i 的左孩子为 2i
?如果 2i > n , 则结点 i 无左孩子
?如果 2i+1 <= n ,则结点 i 为 的右孩子为 2i+1
?如果 2i+1 > n , 则结点 i无右孩子

二、创建二叉树的方法

指路法定位结点

指路法通过根结点与目标结点的相对位置进行定位
指路法可以避开二叉树递归的性质“线性”定位

二叉树存储结构

用结构体来定义二叉树中的指针域
二叉树的头结点也可以用结构体实现
 //结点指针域定义
typedef struct _tag_BTreeNode BTreeNode;
struct _tag_BTreeNode
{
    BTreeNode* left;
    BTreeNode* right;
};                             

//头结点定义
typedef struct _tag_BTree TBTree;
struct  _tag_BTree
{
    int count;
    BTreeNode* root;
};

定位:利用二进制中的0和1分别表示left和right,位运算是实现指路法的基础

三、遍历二叉树

单链表的遍历是指从第一个结点开始(下标为0的结点),按照某种次序依次访问每一个结点。
二叉树的遍历是指从根结点开始,按照某种次序依次访问二叉树中的所有结点。
前序遍历

中序遍历

后序遍历

层次遍历

四、线索化二叉树

线索化二叉树指的是将二叉树中的结点进行逻辑意义上的“重排列”,使其可以线性的方式访问每一个结点
二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要遍历二叉树
线索化方法1
 利用结点中的空指针域,使其指向后继结点

算法思想:

线索化方法2
 利用线性表保存二叉树的遍历顺序

算法思想:

利用结点空指针线索化的方法会破坏树的结构,线索化二叉树之后不能够再恢复
这两个问题可以在树结点中加入一个线索化指针而得以解决
 然而线索化指针的加入又会浪费内存空间,不够灵活
 链表线索化方法不会破化树的结构,不需要时线索化时销毁链表即可
链表线索化方法可以很容易的以任何一种遍历顺序对二叉树进行线索化

五、霍夫曼树

实现代码

原文地址:https://blog.51cto.com/yinsuifeng/2423812

时间: 2024-08-12 09:31:45

九、二叉树和霍夫曼树的相关文章

最优二叉树(霍夫曼树)分析

 1.树的路径长度     树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 2.树的带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积. 树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和,通常记为: 其中: n

九度 1107 - 霍夫曼树 - 搬水果

这道题目一开始我用排序来做,每次选择最小的两个,相当于构建了霍夫曼树,最后统计所有非叶子结点之和.但是因为每次排序的基数太大,所以会一直超时. 所以我们用优先队列模拟一个堆,利用最小堆的特征来快速得到最小的两个数.STL带有优先队列-priority_queue. priority_queue 对于基本类型的使用方法相对简单.他的模板声明带有三个参数: priority_queue<Type, Container, Functional> 其中Type 为数据类型, Container 为保存

数据--第38课 - 霍夫曼树

第38课 - 霍夫曼树 1. 最初的解决方案 对于文本“BADCADFEED”的传输而言,因为重复出现的只有“ABCDEF”这六个字符,因此可以用下面的方式编码: A B C D E F 000 001 010 011 100 101 接收方可以根据每3个bit进行一次字符解码的方式还原文本信息. 2. 存在的问题 这样的编码需要30个bit才能表示10个字符.容易出错. 3. 改进 避免每个字符都占用相同的bit位. A B C D E F 01 1001 101 00 11 1000 25个

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做

霍夫曼树 java实现

作为一个通信人,本科时候上过信息论,研究生也继续修过信息编码.面试的时候,面试官说了一个霍夫曼树,作为一个通信人竟然忘了.多少有些说不过去. 理论知识 Huffman算法的最根本的原则是:累计的(字符的统计数字字符的编码长度)为最小,也就是权值(字符的统计数字字符的编码长度)的和最小. 这样编码可以达到压缩的效果.又名最优二叉树. 具体的可以参考左耳朵耗子的博客:http://coolshell.cn/articles/7459.html 很形象. 实现 主要包括:构造树.编码.解码.show

霍夫曼树及霍夫曼编码的C语言实现

从周五开始学习霍夫曼树,一直到今天终于完成,期间遇到了各种各样的棘手的问题,通过一遍遍在纸上分析每一步的具体状态得以解决.现在对学习霍夫曼树的过程加以记录 首先介绍霍夫曼树 霍夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树.假设有n个权值{w1,w2,-,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,-,wn},则所构造出的带权路径长度最小的二叉树就被称为赫夫曼树. 这里补充下树的带权路径长度的概念.树的带权路径长度指树中所有叶

Fence Repair_霍夫曼树(最优树)_堆

Fence Repair TimeLimit:2000MS  MemoryLimit:65536K 64-bit integer IO format:%lld Problem Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of

word2vec 中的数学原理二 预备知识 霍夫曼树

主要参考:    word2vec 中的数学原理详解                 自己动手写 word2vec 编码的话,根是不记录在编码中的 这一篇主要讲的就是霍夫曼树(最优二叉树)和编码.  参考   快速画出哈夫曼树 / 霍夫曼树 / 最优树   了解其构成.    哈夫曼树及 python 实现 python 代码 构建霍夫曼树 ,获得霍夫曼编码    简单实现: #节点类 class Node(object): def __init__(self,name=None,value=N

霍夫曼树 二三树 红黑树 B树 B+树

霍夫曼树: 特点:带权路径长度最短,∑(每个节点的权重)*(每个节点的层数) 生成:每次合并权值最小的两个节点(子树)建立二叉树,将合并后的子树作为新节点,权值为节点(子树)权值之和 二三树: 特点:平衡查找树,每个叶子节点为空且层数相同,查找时间复杂度O(lgn) 生成:2节点包含一个key和两个子节点(left->key<key<right->key),3节点包含两个key和三个子节点(left->key<key1<middle->key<key2