王道25年数据结构5.2,5.3习题讲解

在这里插入图片描述

  1. 二叉树:是一种特殊的树形数据结构,每个结点最多有两个子结点,通常被称为左子结点和右子结点。
  2. 结点的度:指的是一个结点的子结点数。度为0的结点称为叶子结点,度为1的结点称为单分支结点,度为2的结点称为双分支结点。

题目给出的条件是:二叉树有2n个结点,且m < n。

题目:设二叉树有2n个结点,且( m < n ),则不可能存在:

A. ( n )个度为0的结点
B. ( 2m )个度为0的结点
C. ( 2m )个度为1的结点
D. ( 2m )个度为2的结点

A. ( n )个度为0的结点

分析

  • 二叉树的叶子结点数最多是 ( n )(当树是完全二叉树时)。
  • 因此,当 ( m < n ) 时,( n ) 个度为0的结点是可能的。

结论:A选项是可能的。

B. ( 2m )个度为0的结点

分析

  • 如果有 ( 2m ) 个度为0的结点,那么剩下的结点数是 ( 2n - 2m )。
  • 这些剩下的结点中,至少有 ( m ) 个结点是度为1的(因为每个度为1的结点连接一个叶子结点),剩下的 ( 2n - 3m ) 个结点是度为2的。
  • 但是,( 2n - 3m ) 必须大于等于0,即 ( 2n >= 3m )。
  • 由于 ( m < n ),( 2n >=3m ) 是可能的。

结论:B选项是可能的。

C. ( 2m )个度为1的结点

分析

  • 如果有 ( 2m ) 个度为1的结点,那么这些结点将连接到 ( 2m ) 个度为0的结点(叶子结点)。
  • 这样,剩下的结点数是 ( 2n - 2m )。
  • 但是,( 2n - 2m ) 必须大于等于 ( 2m )(因为每个度为1的结点连接一个叶子结点),即 ( 2n>= 4m )。
  • 由于 ( m < n ),( 2n>=4m ) 是不可能的。

结论:C选项是不可能的。

D. ( 2m )个度为2的结点

分析

  • 如果有 ( 2m ) 个度为2的结点,那么这些结点将连接到 ( 4m ) 个结点。
  • 这样,剩下的结点数是 ( 2n - 4m )。
  • 但是,( 2n - 4m ) 必须大于等于0,即 ( 2n>= 4m )。
  • 由于 ( m < n ),( 2n >= 4m ) 是可能的。

结论:D选项是可能的。

详细讲解过程

  1. 理解二叉树的度:首先,我们需要让学生理解什么是二叉树的度,即一个结点的子结点数。
  2. 分析选项A
    • 说明在二叉树中,叶子结点的数量最多是 ( n )(满二叉树的情况)。
    • 举例说明,如果树是完全二叉树,那么叶子结点的数量就是 ( n ),这是可能的。
  3. 分析选项B
    • 假设有 ( 2m ) 个度为0的结点,那么剩下的结点数是 ( 2n - 2m )。
    • 说明每个度为1的结点会连接一个叶子结点,因此剩下的结点中至少有 ( m ) 个是度为1的,剩下的 ( 2n - 3m ) 个是度为2的。
    • 计算并说明 ( 2n >=3m ) 是可能的。
  4. 分析选项C
    • 假设有 ( 2m ) 个度为1的结点,那么这些结点将连接到 ( 2m ) 个度为0的结点。
    • 说明剩下的结点数是 ( 2n - 2m ),并且 ( 2n - 2m ) 必须大于等于 ( 2m ),即 ( 2n>= 4m )。
    • 计算并说明 ( 2n >=4m ) 是不可能的,因为 ( m < n )。
  5. 分析选项D
    • 假设有 ( 2m ) 个度为2的结点,那么这些结点将连接到 ( 4m ) 个结点。
    • 说明剩下的结点数是 ( 2n - 4m ),并且 ( 2n - 4m ) 必须大于等于0,即 ( 2n >=4m )。
    • 计算并说明 ( 2n >= 4m ) 是可能的。

22.具有n个结点的三叉树用三叉链表表示,则树中空指针域的个数为(
A. 3n+1
B.2n+1
C.3n-1
D.3n

问题描述

假设我们有一棵三叉树,每棵树最多有3个子结点,我们用三叉链表来表示它。我们需要找出树中空指针的总数。

基本概念

  • 三叉树:每个结点最多有3个子结点。
  • 三叉链表:每个结点有3个指针,分别指向左子结点、中子结点和右子结点。如果某个子结点不存在,对应的指针就是空的。

求解过程

  1. 理解空指针

    • 每个结点最多有3个指针,指向3个子结点。
    • 如果某个结点没有子结点,那么它的3个指针都是空的。
  2. 计算空指针总数

    • 假设树有n个结点,每个结点最多有3个指针。
    • 那么理论上,所有的指针总数是[3n]。
  3. 计算非空指针

    • 在三叉树中,除了根结点外,每个结点都只有一个父结点。
    • 因此,除了根结点外,每个结点的中子结点指针不为空。
  4. 计算空指针总数

    • 总共有[3n]个指针,减去非空的指针。
    • 非空指针数是[n-1](除了根结点外,每个结点都有一个非空的中子结点指针)。
    • 因此,空指针总数是[3n - (n-1)]。
  5. 简化表达式

    • 简化后,空指针总数是[2n + 1]。

总结

所以,具有n个结点的三叉树用三叉链表表示时,树中空指针的总数是[2n + 1]。这就是为什么选项B是正确答案。

例子

假设我们有3个结点的三叉树:

    1
   /|\
  2 3 4
  • 结点1有3个指针(指向2、3、4),都不是空的。
  • 结点2、3、4各有3个指针,其中2个指向空(因为它们没有子结点)。

总共有:

  • 1个结点(根结点)有3个空指针。
  • 3个结点(2、3、4)各有2个空指针。

总共的空指针数是[1 * 3 + 3 * 2 = 9],而总共的指针数是[4 * 3 = 12]。

所以,空指针数是[12 - 9 = 3],符合[2n + 1]的公式([n = 4])。

31.()的遍历仍需要栈的支持。
A.前序线索树B.中序线索树C.后序线索树 D.所有线索树

问题背景

在树的遍历中,线索二叉树(线索化后的二叉树)是一种特殊的树,它的某些空指针被用来存储遍历序列中的前驱或后继信息。这使得遍历可以不使用栈。

选项分析

A. 前序线索树

  • 前序遍历的顺序是:根结点 -> 左子树 -> 右子树。
  • 在前序线索树中,左线索指向根结点的前驱,右线索指向根结点的后继。
  • 结论:前序遍历不需要栈,因为可以通过线索直接找到下一个结点。

B. 中序线索树

  • 中序遍历的顺序是:左子树 -> 根结点 -> 右子树。
  • 在中序线索树中,左线索指向根结点的后继,右线索指向根结点的前驱。
  • 结论:中序遍历不需要栈,因为可以通过线索直接找到下一个结点。

C. 后序线索树

  • 后序遍历的顺序是:左子树 -> 右子树 -> 根结点。
  • 在后序线索树中,线索的使用比较复杂,通常需要额外的指针来辅助遍历。
  • 结论:后序遍历通常需要栈的支持,因为线索不能直接提供完整的遍历路径。

D. 所有线索树

  • 这个选项意味着所有类型的线索树。
  • 由于后序线索树需要栈,因此这个选项是错误的。

求解过程

  1. 理解遍历顺序

    • 前序遍历:先访问根结点,再访问左子树,最后访问右子树。
    • 中序遍历:先访问左子树,再访问根结点,最后访问右子树。
    • 后序遍历:先访问左子树,再访问右子树,最后访问根结点。
  2. 理解线索的作用

    • 线索是用来替代空指针,指向树中其他结点的。
    • 前序和中序线索树的线索可以方便地找到下一个需要访问的结点。
  3. 分析选项

    • A和B选项的前序和中序线索树,线索可以直接提供下一个结点,不需要栈。
    • C选项的后序线索树,线索不能直接提供完整的遍历路径,需要栈来辅助。

结论

因此,正确答案是C. 后序线索树。后序线索树的遍历需要栈的支持,而前序和中序线索树的遍历不需要栈。选项D包含了所有线索树,因此也是错误的。

例子

假设我们有以下二叉树:

    1
   / \
  2   3
  • 前序遍历(根结点 -> 左子树 -> 右子树):1 -> 2 -> 3
  • 中序遍历(左子树 -> 根结点 -> 右子树):2 -> 1 -> 3
  • 后序遍历(左子树 -> 右子树 -> 根结点):2 -> 3 -> 1

在前序和中序遍历中,我们可以通过线索直接找到下一个结点,不需要栈。但在后序遍历中,我们需要使用栈来记住左子树和右子树的访问顺序。

36.【2012统考真题】若一棵二叉树的前序遍历序列为a, e, b,d, c,后序遍历序列为b, c, d, e,a,则根结点的孩子结点
A.只有e
B.有e,b
c.有e、c
D.无法确定

问题描述

给定一棵二叉树的前序遍历序列为 a, e, b, d, c 和后序遍历序列为 b, c, d, e, a,我们需要找出根结点的孩子结点。

选项分析

A. 只有e
B. 有e, b
C. 有e、c
D. 无法确定

求解过程

  1. 理解前序遍历

    • 前序遍历的顺序是:根结点 -> 左子树 -> 右子树。
    • 在前序遍历中,第一个元素是根结点。
  2. 理解后序遍历

    • 后序遍历的顺序是:左子树 -> 右子树 -> 根结点。
    • 在后序遍历中,最后一个元素是根结点。
  3. 分析前序遍历序列

    • 前序遍历序列为 a, e, b, d, c
    • 根结点是 a
  4. 分析后序遍历序列

    • 后序遍历序列为 b, c, d, e, a
    • 根结点是 a
  5. 确定根结点的孩子

    • 在前序遍历中,根结点 a 后面紧跟的是 e,这意味着 e 是根结点的直接孩子。
    • 在后序遍历中,根结点 a 前面是 e,而 e 前面是 d,这意味着 e 是根结点的直接孩子。
  6. 排除其他选项

    • 如果 e 是根结点的左孩子,那么 b, d, c 应该是 e 的右子树,这与后序遍历不符。
    • 因此,e 必须是根结点的右孩子。

结论

根据以上分析,根结点 a 的孩子结点只有 e。因此,正确答案是:

  • A. 只有e

总结

通过分析前序和后序遍历序列,我们可以确定根结点的孩子结点是 e。这是因为在前序和后序遍历中,e 都是紧跟在根结点 a 后面的元素。

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值