二叉树的相关选择题和基本方法(持续更新)

如果一棵树从1开始按下图一层一层的顺序编号,如果在到最后一个节点前没有出现空节点,那么则这棵树是完全二叉树

在这里插入图片描述

在此图中,如果10之前只要存在一个节点不存在,则就不是完全二叉树。

选择题1

在这里插入图片描述

解:题目中描述 一颗完全二叉树的某个节点没有左孩子,所以它一定也没有右孩子,所以度为0,为叶子节点,选B


选择题2

在这里插入图片描述

解:核心公式:n0 = n2 + 1(n0、n1、n2分别代表度0、1、2的点)

总的节点数 = n0 + n1 + n2

有题目可得:n0 = 3, n1= 8,所以n2 = 2

所以总的节点数 = 2 + 3 + 8 = 13,选C


选择题3

在这里插入图片描述

解:

A:树是一种特殊的无环图,树中的节点不能相交,A错误
B:树的度是指所有节点中度最大的节点的度,B错误
C:树的深度指的是树中的节点存在的最高层数,并不是节点数最多的那一层,C错误
D:D正确


选择题4

在这里插入图片描述
解:

  1. 利用前序遍历和中序遍历还原整颗二叉树
  2. 得到二叉树的后序遍历

前序遍历字符串的第一个节点一定是根节点

在中序遍历字符串中,5的左边节点一定在5的左子树里,5的右边节点一定在5的右子树。

从前往后逐一将前序遍历的节点当做根节点,再根据该节点在中序遍历的位置得到他的左右子树,就可以构造出二叉树

在这里插入图片描述
这是中序遍历的序列

现在我们从前序遍历的5开始。5的左边的数字在5的左子树里,右边数字同理

在这里插入图片描述
下一个数字是7,所以4是7的左儿子,由于7的右边没有数字(大前提是在5的左边),所以7没有右儿子

在这里插入图片描述

下一个数字是4,由于4左右都没有数字了,所以没有左右儿子,接下来是 数字9

6在9的左边,数字1、2在9的右边

在这里插入图片描述

最后 6没有,1在2的左边,所以最终的二叉树长下面这个样子
在这里插入图片描述
最终易得后序遍历为 4 7 6 1 2 9 5 ,所以选C


选择题5

在这里插入图片描述

解:
1. 假设有一个postIndex下标 从后序遍历序列的末尾开始准备向前遍历
2. 每次找到 后序遍历序列中postIndex下标的值其 所在中序遍历序列的位置
3. 位置左边为左子树,右边为右子树

在这里插入图片描述

找到A在中序遍历序列的位置

在这里插入图片描述

接着找C,后序遍历优先度是 左 右 根,倒着遍历就相当于是 根 右 左,所以找C 需要优先在A的右子树里找,如果在右子树里找不到,就证明右子树为空树

重复的找,直到postIndex指向 J的左边位置,就可以画出整个二叉树的结构

在这里插入图片描述

有了二叉树的结构,易得前序遍历
在这里插入图片描述
所以ABDGJHKCEILMF,所以选B

选择题6

在这里插入图片描述
解:

  1. 和选择题4一样,通过前序遍历和中序遍历构造二叉树
  2. 通过二叉树的结构判断选哪个选项
    在这里插入图片描述

在这里插入图片描述

根据二叉树的结构,选项ABD都是错的,所以选C

选择题7

在这里插入图片描述
n0、n1、n2分别代表整棵树中度为0、1、2的节点总个数

解:

  1. 要么是叶子节点,要么有两颗子树 的意思是 n1 = 0
  2. m个叶子节点代表 n0 = m
  3. 又因为 n0 = n2 + 1(所有二叉树都满足的公式),且 节点总数 = n0 + n1 + n2

所以转变成了一下问题
在这里插入图片描述

所以最终答案是 2m-1,选C


选择题8

在这里插入图片描述

解:

  1. 最深情况是 每一层只有一个节点,故深度最大是n
  2. 深度最小的情况是,该二叉树类似于完全二叉树排列,根据完全二叉树的性质,深度为 log(n+1)向上取整
  3. 所以选A

选择题9

在这里插入图片描述
解:

  1. A选项公式为二叉树一定满足的公式,证明如下
  2. N 个节点一定有 N - 1 个边(除了根节点所有的都会带一个边
  3. n0 + n1 + n2 = N(三种节点相加等于节点总和), 2n2 + 1 n1 + 0*n0 = N - 1(三种边数等于总边数
  4. 2*n2 + n1 = n0 + n1 + n2 - 1
  5. 相消之后 得到 n0 = n2 + 1

选择题10

在这里插入图片描述
解:

  1. 广度优先遍历是一层一层的遍历,只有当把下一步所有可能的位置遍历完才会进行更深层次的遍历,所以选层序遍历
  2. 深度优先遍历注重深度,会先遍历完一条完整的路径(从跟到叶子的路径),然后退回继续遍历其他路径,前序遍历是一种深度优先遍历
  3. 所以选D

选择题11

在这里插入图片描述

解:

  1. 易得满足条件的二叉树的深度不是三层就是四层
  2. 四层的二叉树中,节点B、C、D各自共有两种可能,分别是A、B、C的左孩子或者右孩子,所以共有2 * 2 * 2 = 8种
  3. 对于三层的情况,我们可以将B固定住然后数一数,共有 6 种情况
    在这里插入图片描述
  4. 所以共有 8 + 6 = 14种

选择题12

在这里插入图片描述
解: 根据完全二叉树的性质完全二叉树的深度为log(n+1)向上取整,所以选D

选择题13

在这里插入图片描述

解:本题考查完全二叉树的性质,深度等于 log(n+1)向上取整 或 log(n) + 1 向下取整,所以选B

选择题14

在这里插入图片描述

解:层序遍历的模版就是 首先将根节点入队列然后每次将 出队节点的左右子节点入队列,这样可以保证一定是一层一层进行遍历的,所以本题选择D

选择题15

在这里插入图片描述

解:中序遍历的遍历优先度是 左儿子 > 根节点 > 右儿子,根据题目描述值的大小关系为 左 < 根 < 右,故选择 A 中序遍历

选择题16

在这里插入图片描述

解:如果根节点从1开始编号,那么n 号节点的左儿子的编号就是 2n,右儿子就是 2n+1,x号节点的父亲则是 x / 2,所以98 / 2 = 49,所以选C

选择题17

在这里插入图片描述
解:A、B、D选项都是C选项的一种特殊的情况,也就说满足A、B、D也就一定满足C选项,所以本题一定选C

在这里插入图片描述

无论是没有左孩子,还是没有右孩子,还是只有一个节点 都满足 前序遍历和后序遍历刚好相反的,所以不可能选他们当中的一个选项,所以选C。

选择题18

在这里插入图片描述
解:

  1. 1001个节点,由于是奇数个节点且是一个完全二叉树,所以没有度为1的节点,n1 = 0
  2. 又根据公式 n0 = n2 + 1(n0、n1、n2分别代表度为0、1、2的节点)
  3. 所以2*n0 - 1 = 1001
  4. 所以n0 = 501,选C

补充:如果节点是偶数的,那么只有一个度为1的节点

选择题19

在这里插入图片描述
解:

  1. 二叉树指的是树的度最高为2,不是深度为2,所以A选项错误
  2. B选项除了根节点,每一个节点都需要一条边连向另一个节点
  3. C选项为满二叉树的性质
  4. 二叉链代表着每个节点可以获取最多两个节点的信息,比如左右孩子表示法等等,三叉链则比如孩子双亲表示法等等,所以D选项正确

选择题20

在这里插入图片描述

解:当这棵树按照完全四叉树的排列顺序排列时此时深度最小,在满四叉树中,节点总数为 40 + 41+ … + 4h-1,根据等比数列求和可以得出 节点总数 = (4h- 1) / 3

当深度为5时,满四叉树的节点总数是 341,当深度为6时,满四叉树的节点总数是1365,所以1000个节点的最小深度就是 6,所以选B

选择题21

在这里插入图片描述
解:

  1. 由题目可得:n3 = 2, n2 = 1, n1 = 2
  2. 设N为节点总数,则 n0 + n1 + n2 + n3 = N
  3. N个节点共有 N - 1条边,0*n0 + 1*n1 + 2*n2 + 3*n3 = N - 1
  4. 解得 n0 = 6,所以选C

选择题22

在这里插入图片描述

解:在树中,从根节点到叶子结点有且只有一条通道,所以选择A选项

实现二叉树的基本操作

实现二叉树的基本操作,完成下列函数

public class BinaryTree {

    static class TreeNode {
        public char val;
        public TreeNode left;//左孩子的引用
        public TreeNode right;//右孩子的引用

        public TreeNode(char val) {
            this.val = val;
        }
    }


    /**
     * 创建一棵二叉树 返回这棵树的根节点
     *
     * @return
     */
    public TreeNode createTree() {

    }

    // 前序遍历
    public void preOrder(TreeNode root) {
    }

    // 中序遍历
    void inOrder(TreeNode root) {
    }

    // 后序遍历
    void postOrder(TreeNode root) {
    }

    public int nodeSize;

    /**
     * 获取树中节点的个数:遍历思路
     */
    void size(TreeNode root) {
    }

    /**
     * 获取节点的个数:子问题的思路
     *
     * @param root
     * @return
     */
    int size2(TreeNode root) {
    }


    /*
     获取叶子节点的个数:遍历思路
     */
    public int leafSize = 0;

    void getLeafNodeCount1(TreeNode root) {
    }

    /*
     获取叶子节点的个数:子问题
     */
    int getLeafNodeCount2(TreeNode root) {
    }

    /*
    获取第K层节点的个数
     */
    int getKLevelNodeCount(TreeNode root, int k) {
    }

    /*
     获取二叉树的高度
     时间复杂度:O(N)
     */
    int getHeight(TreeNode root) {
       
    }


    // 检测值为value的元素是否存在
    TreeNode find(TreeNode root, char val) {
        
        return null;
    }

    //层序遍历
    void levelOrder(TreeNode root) {
        
    }


    // 判断一棵树是不是完全二叉树
    boolean isCompleteTree(TreeNode root) {
        return true;
    }
}

没有提到的都在下方这个文章里有
二叉树相关oj题


createTree函数里可以自由手动创建一颗自己想要的树,比如我创建了如下图的二叉树
在这里插入图片描述

在这里插入图片描述


查询二叉树当中节点的个数

遍历思想

思路:遍历思想,遍历整个二叉树。

在这里插入图片描述

子问题思想

思路:利用子问题思想
在这里插入图片描述


获取叶子节点的个数

遍历思想

在这里插入图片描述

子问题思想

在这里插入图片描述

检测值为value的元素是否存在

在这里插入图片描述

获取一颗二叉树的高度

在这里插入图片描述


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值