基础算法学习(二)_二叉树及应用赫夫曼编码

    这次学习的重点在于二叉树的性质、链式存储结构(也就是C语言的struct)和赫夫曼编码,学习的教材是清华大学出版社出版的C语言版数据结构。

    首先是二叉树
    二叉树(Binary Tree)是另一种树形结构,它的特点是每个结点至多只有二棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒。 

   二叉树的性质
   二叉树作为一种重要的树形结构,在实际生活中的应用虽然不大,但它的结构使我们需要重点研究的。下面写一写二叉树的性质和一些我的理    解。
   性质1   在二叉树的第i层至多有2^(i-1)个结点。这里,我们把根定义为第一层。
              证明:用归纳法证明。
   性质2   深度为k的二叉树至多有2^k-1个结点。
              证明:结合性质1,用等比数列求和公式。
   性质3   对任何一颗二叉树T,如果其终端结点数位n0,度为2的结点数为n2,则n0=n2+1 。
              证明:设整个树的结点数为n,则n=n0+n1+n2 。   (1)
                       而树里的每个结点(除开根节点)都是由一条分支引出,则n=n1+2n2+1 。  (2)
                       综合(1)(2)得出 n0=n2+1 。
   性质4  具有n个结点的完全二叉树的深度为 └logaN┘+1 。└ ┘表示取下整数。

   二叉树的链式存储结构
  
typedef struct  BinTree{
          int  data;
          struct  BinTree *lchild,*rchild;    
   }BinTree,*BinTree;

   赫夫曼编码
  
赫夫曼树,又称最优树,是一类带权路径长度最短的树。定义有着带权路径长度最小的二叉树称作最优二叉树(赫夫曼树)
   那么,如何构造赫夫曼树呢?现叙述如下:
(1)根据给定的n个权值{w1,w2…wn}构造n棵二叉树的集合F={T1,T2…Tn},每课二叉树Ti的根的权为Wi,左右子树为空。
(2)将F={T1,T2…Tn}按权值由小到大稳定排序。
(3)由最小的两个权值树T1,T2组成树T,根的权为T1,T2根的权之和,左右子树分别为T1、T2 。
(4)在F中删除T1、T2,同时将T按序插入F中。
(5)重复(3)、(4),直到F中只剩一棵树。

posted @ 2009-12-19 13:40  唐颖  阅读(585)  评论(0编辑  收藏  举报