树和二叉树

一、概述

1、1树的定义及基本术语

树定义:树(tree)是n(n>=0)个节点的有限集。在任意一棵非空树中,(1)有且仅由一个特定的结点称之为根结点(root),(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2...,其中每个集合又是一棵树,称为根结点的子树。

结点的度:结点拥有的子树数称为结点的度,度为0的结点称为叶子结点。树的度是树内各个结点度的最大值。

孩子(child):结点子树的根。例如B称为A的孩子,A称为B的双亲(Parent)

兄弟:同双亲,例如C是B的兄弟结点。

树的深度:数中结点的最大层次称为树的深度,如图,两棵树的深度均为4。

1、2  二叉树

定义:二叉树是一种特殊的树形结构,其特点是每个结点最多只有两颗子树。

二叉树的性质:

(1)在二叉第i层上之多有2的i-1次方,n>=1。

(2)深度为k的二叉树最大的结点数为2的k次方减1。

  (3)叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。

满二叉树:深度为k,并且有2的k次方减1个结点。

完全二叉树:即叶子结点只能出现在最大的两层,与满二叉树为例,它的序号不能错开。

(4)有n个结点的二叉树的深度为log2N向下取整+1。

(5)。。。

1、3二叉树的遍历

先序遍历:(1)访问根结点(2)先序遍历左子树(3)先序遍历右子树。如 -+a*b-cd    -  /ef

中序遍历:(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树 。如a+b*c-d   -  e/f

后续遍历:(1)后序遍历左子树(2)后序遍历右子树(3)访问根结点。如abcd-*+  ef/  -

理解:先中后都是根据根结点来思考,子树也是一颗树,也有自己的根结点。不管是先、中、后遍历,都是从左边开始再到右边。

二、叉树的存储结构

2、1顺序存储结构

用一组连续的地址自上而下,自左而右的存储二叉树的结点。可以用一个特定的字符表示不存在的结点。这种存储结构适用于完全二叉树(满二叉树也是完全二叉树),对于其它形式的二叉树浪费存储空间。

2、2链式存储结构

设置不同的结点结构可构成不同形式的链式存储结构。用于表示二叉树的结点,必须包含三个域,为数字域,左指针、右指针。链表的头指针指向二叉树的根结点。存在问题,有n个结点的二叉树,有n+1个空指针域。利用空指针域存储其它信息,从而得到线索二叉树

三、赫夫曼树(最优二叉树)

如图为带权二叉树,其中c为带权路径最小的树。WPL=1*7+2*5+2*3+3*4=35。

如何构造最优二叉树?

例如:

字母abcd
权值7524

 

 

 

每条边的长度算为1,带权路径就是这么计算的 。

最优二叉树的应用——赫夫曼编码

     快速远距离通讯的主要手段是电报,即将需要传送的文字转成二进制的字符组成的字符串。在转送报文时,希望总长度尽可能的短。

    利用二叉树来设计长度不等的编码,并且任一个字符的编码都不可能是另一个字符编码的前缀,这种编码称为前缀编码。

例如:在要发送‘abcd’这样的一段报文中,各个字符出现的概率为

字符abcd
概率0.50.20.20.1

 

 

 

可以构造成如下的最优二叉树,则有各个字符对应的编码为

a(0)    b(10 )  c(111)   d:(110)     发送的报文为“010111110”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值