考研复试——数据结构第五章

第五章树与二叉树

1、树与二叉树的相关概念?
是非线性结构,其元素之间有明显的层次关系。树中最大的节点的度为树的度,树的最大的层次称为树的深度。
二叉树:二叉树是另一种树形结构,其特点是每个结点至多只有两棵树,并且二叉树的子树有左右之分,其次序不能任意颠倒。与树相似,二叉树也以递归的形式定义。二叉树是n个结点的有限集合。
(1)或者为空二叉树,即n=0;
(2)或者由一个跟结点和两个互不相交的被称为跟的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。
二叉树是有序树,若将其左、右子树颠倒,则成为另一颗不同的二叉树。即使树中结点只有一颗子树,也要区分它是左子树还是右子树。
满二叉树:满二叉树是指除了最后一层外其他结点均有两颗子树。
完全二叉树:完全二叉树是指除最后一层外,其他任何一层的结点数均达到最大值,且最后一层也只是在最右侧缺少结点。
二叉树的存储:二叉树可以用链式存储结构来存储,满二叉树和完全二叉树可以用顺序存储结构来存储。
二叉树的遍历:二叉树有先序遍历,中序遍历和后序遍历,还有层次遍历,需要借助一个队列。
三种遍历算法中,递归遍历左、右子树的顺序都是固定的,只是访问根结点的顺序不同。不管采用哪种遍历算法,每个结点都访问一次且仅访问一次,故时间复杂度都是O(n)。在递归遍历中,递归工作栈的栈深恰好为树的深度,所以在最坏情况下,二叉树是有n个结点且深度为n的单支树,遍历算法的空间复杂度为O(n)。
2、如何由遍历序列构造一颗二叉树?
(1)由二叉树的先序序列和中序序列可以唯一地确定一颗二叉树。
在先序遍历序列中,第一个节点一定是二叉树的根结点;而中序遍历中,根结点必然将中序序列分割成两个子序列,前一个子序列是根结点的左子树的中序序列,后一个子序列是根结点的右子树的中序序列。根据这两个序列,在先序序列中找到对应的左子序列和右子序列。在先序序列中,左子序列的第一个结点是左子树的根结点,右子序列的第一个结点是右子树的根结点。如此递归下去,便能唯一地确定这颗二叉树。
(2)由二叉树的后序序列和中序序列也可以唯一地确定一颗二叉树。
因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分,进而得到一颗二叉树。
(3)由二叉树的层次序列和中序序列也可以唯一确定一颗二叉树。需要注意的是,若只知道二叉树的先序序列和后序序列,则无法唯一确定一颗二叉树。
3、线索二叉树的概念?
对于n个结点的二叉树,在二叉链式存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。
这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
**注意:**线索链表解决了无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题,解决了二叉链表找左、右孩子困难的问题。
二叉树的遍历本质上时将一个复杂的非线性结构转换为线性结构,使每个结点都有唯一前驱和后继。对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,有两种方法。一是在结点结构中增加向前和向后的指针,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。
4、树的存储结构?
(1)双亲表示法;
这种存储方式采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置。
该存储结构利用了每个结点只有唯一双亲的性质,可以很快得到每个结点的双亲结点,但求结点的孩子时需要遍历整个结构。
(2)孩子表示法:
孩子表示法是将每个结点的孩子结点都用单链表链接起来形成一个线性结构,此时n个结点就有n个孩子链表,这种存储方式寻找子女的操作非常直接,而寻找双亲的操作需要遍历n个结点中孩子链表指针域所指向的n个孩子链表。
(3)孩子兄弟表示法:
孩子兄弟表示法又称二叉树表示法,即以二叉链表作为树的存储结构。孩子兄弟表示法使每个结点包括三部分内容:结点值、指向结点第一个孩子结点的指针,及指向结点下一个兄弟结点的指针。
这种存储表示法比较灵活,其最大的优点是可以方便地实现树转换为二叉树的操作,易于查找结点的孩子等,但缺点是从当前结点查找其双亲结点比较麻烦。若为每个结点增设一个parent域指向其父结点,则查找结点的父结点也很方便。
5、二叉排序树
(1)二叉排序树的定义:
二叉排序树(也称二叉查找树)或者是一颗空树,或者是具有下列特性的二叉树:
1>若左子树非空,则左子树上所有结点的值均小于根结点的值。
2>若右子树非空,则右子树上所有结点的值均大于根结点的值。
3>左、右子树也分别是一颗二叉排序树。
根据二叉排序树的定义,左子树结点值<根结点值<右子树结点值,所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。
(2)二叉排序树的查找:
二叉排序树的查找是从根结点开始的,延某个分支逐层向下比较的过程。若二叉树非空,先将给定值与根结点的关键字,若相等,则查找成功;若不等,如果小于根结点的关键字,则在跟结点的左子树上查找,否则在跟的右子树上查找。这显然是一个递归的过程。
6、平衡二叉树
为避免树的高度增长过快,降低二叉树的性能,规定在插入和删除二叉树结点时,要保证任意结点的左、右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树,简称平衡树。定义结点左子树与右子树的高度差为该结点的平衡因子,则平衡二叉树结点的平衡因子的值只可能是-1、0、或1。因此,平衡二叉树可定义为或者是一颗空树,或者是具有下列性质的二叉树,它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度差的绝对值不超过1。
7、哈夫曼树和哈夫曼编码
(1)哈夫曼的定义
在许多应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树的跟到任意结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度,树中所有叶结点的带权路径长度之和称为该树的带权路径长度。
在含有n个带权叶结点的二叉树中,其中带权路径长度最小的二叉树称为哈夫曼树,也称最优二叉树。
(2)哈夫曼树的构造
(3)哈夫曼编码
在数据通信中,若对每个字符用相等长度的二进制位表示,称这种编码方式为固定长度编码。若允许对不同字符用不等长度的二进制位表示,则这种编码方式称为可变长度编码。可变长度编码比固定长度编码要好的多,其特点是对频率高的字符赋以短编码,而对频率较低的字符则赋以较长一些的编码,从而可以使字符的平均编码长度减短,起到压缩数据的效果。哈夫曼编码是一种被广泛应用而且非常有效的数据压缩编码。若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码。
由哈夫曼树得到哈夫曼编码是很自然的过程。首先,将每个出现的字符当做一个独立的结点,其权值为它出现的频度,构造出对应的哈夫曼树。显然,所有字符结点都出现在叶结点中。我们可以将字符的编码解释为从跟至该字符的路径上边标记的序列,其中边标记为0表示“转向左孩子”,标记为1表示“转向右孩子”。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值