首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据结构二叉树应用实战:多场景练习题强化巩固

数据结构二叉树应用实战:多场景练习题强化巩固

作者头像
星轨初途
发布2026-01-09 14:39:17
发布2026-01-09 14:39:17
1080
举报
文章被收录于专栏:星轨初途星轨初途

个人主页:星轨初途 个人专栏:C语言数据结构

前言

嗨(*´゚∀゚`)ノ ,我们又见面啦,这一篇我们来继续看一下二叉树,进行选择题和编程题的练习,进行更好的巩固和了解,让我们来更好的了解它吧!

一、选择题

1、二叉树性质选择题

二叉树性质
  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2(i-1)个结点。
  2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2h - 1。
  3. 对任何一棵二叉树,如果度为0的叶结点个数为n₀,度为2的分支结点个数为n₂,则有n₀ = n₂ + 1。
  4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度h=log₂(n+1)。 (ps: log₂(n+1)是以2为底,n+1为真数的对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下、从左至右的顺序对所有结点从0开始编号,则对于序号为i的结点有:

若i>0,i位置结点的双亲序号:(i-1)/2;i=0为根结点编号,无双亲结点。 若2i+1 < n,左孩子序号:2i+1;2i+1 ≥ n则无左孩子。 若2i+2 < n,右孩子序号:2i+2;2i+2 ≥ n则无右孩子。

  • 6、满二叉树,节点为奇数->度为1的节点为0 节点为偶数->度为1的节点为1

证明:

  1. 每层节点最多20 、21、22、23……2n-1证得
  2. 满二叉树是
在这里插入图片描述
在这里插入图片描述

3.这个性质比较重要 证明: 设度为0,1,2的分别用n0,n1,n2来表示

在这里插入图片描述
在这里插入图片描述

我们可以发现,初始n0=1; 每增加一个n1,n0先减少再增加相当于不变 每增加一个n2,n0就增加1个 所以n0永远比n2大1、 所以n0=n2+1;

  • 4、用等比数列求和公式可得20+21+……+2n-1=h h=log₂(n+1)
  • 5、前面证明了,如下
在这里插入图片描述
在这里插入图片描述

题目

(1)
在这里插入图片描述
在这里插入图片描述

解析 利用n0=n2+1;n2=199,则n0=200;n1=399-n0-n2=0; 为满二叉树 选B

(2)
在这里插入图片描述
在这里插入图片描述

答案:A

解析

  • A:非完全二叉树若采用顺序存储,会因节点分布不连续产生大量内存浪费,且无法高效利用完全二叉树的下标关系(如父子节点索引计算),因此不适合顺序存储。
  • B:堆是完全二叉树的应用,依赖顺序存储(数组)可高效维护父-子节点关系,适合顺序存储。
  • C:队列可通过数组实现循环队列,顺序存储能高效完成入队、出队操作。
  • D:栈通过数组实现时,压栈、弹栈操作简单高效,是顺序存储的典型应用。
(3)
在这里插入图片描述
在这里插入图片描述

答案:A 解析 2n=n0+n1+n2, 因为是完全二叉树,节点为偶数,所以度为1的节点为1,即n1=1; 则2n=n0+(n0-1)+1,所以n0=n;选A;

(4)
在这里插入图片描述
在这里插入图片描述

答案:B 解析:

h=log(n+1),带入9<h<10,因为这是满二叉树的公式,所以实际高度为10,最后一层没满

(5)
在这里插入图片描述
在这里插入图片描述

答案:B 解析 完全二叉树,节点为奇数,所以n1=0; 767=n0+n1+n2=n0+0+n0-1; n0=384

2、二叉树链式结构遍历选择题

(1)
在这里插入图片描述
在这里插入图片描述

答案:A 解析: 转换为树如下图

在这里插入图片描述
在这里插入图片描述

前序遍历:根->左节点->右节点 可得前序序列遍历为ABDHECFG

(2)
在这里插入图片描述
在这里插入图片描述

答案:A 由先序规则得

(3)
在这里插入图片描述
在这里插入图片描述

答案:D 用前序遍历确定根,再利用中序将树展现出来

在这里插入图片描述
在这里插入图片描述

再根据图进行前序遍历 选D

(4)
在这里插入图片描述
在这里插入图片描述

答案:A 因为前序与中序结果相同,所以该二叉树只有左树,如图

在这里插入图片描述
在这里插入图片描述

所以层序遍历选A

二、二叉树基础oj练习

1、单值二叉树

链接:单值二叉树

在这里插入图片描述
在这里插入图片描述

解题 解题链接 图片解题

在这里插入图片描述
在这里插入图片描述

代码:

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isUnivalTree(struct TreeNode* root)
 {
    if(root==NULL)
    {
        return true;
    }
    if(root->left!=NULL&&root->left->val!=root->val)
    return false;
    if(root->right!=NULL&&root->right->val!=root->val)
    return false;
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

2、相同的树

链接:相同的树

在这里插入图片描述
在这里插入图片描述

解题链接:解题链接 图片显示

在这里插入图片描述
在这里插入图片描述

代码

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if(p == NULL && q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    if(p->val != q->val)
    {
        return false;
    }
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

3、对称二叉树

题目链接:对称二叉树

在这里插入图片描述
在这里插入图片描述

解题链接:解题链接 图片

在这里插入图片描述
在这里插入图片描述

代码

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 bool isSameTree(struct TreeNode* a,struct TreeNode* b)
 {
    if(a==NULL&&b==NULL)
    {
        return true;
    }
    if(a==NULL||b==NULL)
    {
        return false;
    }
    if(a->val!=b->val)
    {
        return false;
    }
    return isSameTree(a->left,b->right)&&isSameTree(a->right,b->left);
 }
bool isSymmetric(struct TreeNode* root)
 {
    return isSameTree(root->left,root->right);
}

作者:星轨初途
链接:https://leetcode.cn/problems/symmetric-tree/solutions/3837280/jian-dan-dui-cheng-er-cha-shu-by-flamboy-e5ei/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4、二叉树的前序遍历

题目链接:二叉树的前序遍历

在这里插入图片描述
在这里插入图片描述

解答:解题链接 图片解题

在这里插入图片描述
在这里插入图片描述

代码:

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

// 作用:统计二叉树的节点总个数
 int BinarTreeSize(struct TreeNode* a)
 {
    if(a==NULL)
    {
        return 0;
    }
    return BinarTreeSize(a->left)+BinarTreeSize(a->right)+1;
 }

// 作用:递归实现二叉树的前序遍历,并将节点值存入数组中
 void preOrder(struct TreeNode* root,int *arr,int *i)
 {
    if(root==NULL)
    {
        return ;
    }
    arr[(*i)++]=root->val;
    preOrder(root->left,arr,i);
    preOrder(root->right,arr,i);
 }

// 作用:主函数,完成二叉树前序遍历结果的数组封装(分配内存+执行遍历)
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    *returnSize = BinarTreeSize(root);
    int* arr = (int*)malloc(sizeof(int)*(*returnSize));
    //前序遍历
    int i = 0;
    preOrder(root,arr,&i);
    return arr;
}
  

作者:星轨初途
链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/3837311/er-cha-shu-de-qian-xu-bian-li-ti-jie-by-k9mzh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5、. 二叉树中序遍历

链接: 二叉树中序遍历

6、二叉树的后序遍历

链接:二叉树的后序遍历 这两道题与第4题基本一样,大家可以先尝试一下 解题:二叉树中序遍历 二叉树的后序遍历 题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、另一颗树的子树

题目链接:另一颗树的子树

在这里插入图片描述
在这里插入图片描述

解题:解题链接 图片解题

在这里插入图片描述
在这里插入图片描述

代码

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 判断两棵树是否完全相同(节点值和结构都一致)
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if(p == NULL && q == NULL)
    {
        return true; // 两棵树都为空,视为相同
    }
    if(p == NULL || q == NULL)
    {
        return false; // 一棵空一棵非空,视为不同
    }
    if(p->val != q->val)
    {
        return false; // 节点值不同,视为不同
    }
    // 递归判断左右子树是否都相同
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}


bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(root == NULL)
    {
        return false; // 主树为空时,无法包含任何子树(除非subRoot也为空,本题默认subRoot为有效子树)
    }
    if(isSameTree(root,subRoot))
    {
        return true; // 当前主树节点与子树完全相同,直接返回true
    }
    // 递归判断子树是否是左子树的子树,或是否是右子树的子树(只要其一满足即可)
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

作者:星轨初途
链接:https://leetcode.cn/problems/subtree-of-another-tree/solutions/3837255/ling-yi-ke-shu-de-zi-shu-ti-jie-by-flamb-onx7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、结束语

本篇到这里就结束啦٩(๑>◡<๑)۶ ,也就是我们对二叉树的学习已经正式结束啦,相信大家都有所收获,下一篇我们就要开始对排序的学习啦!期待与大家共同进步!让我们期待吧!ヾ(@▽@)ノ

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、选择题
    • 1、二叉树性质选择题
      • 二叉树性质
    • 题目
      • (1)
      • (2)
      • (3)
      • (4)
      • (5)
    • 2、二叉树链式结构遍历选择题
      • (1)
      • (2)
      • (3)
      • (4)
  • 二、二叉树基础oj练习
    • 1、单值二叉树
    • 2、相同的树
    • 3、对称二叉树
    • 4、二叉树的前序遍历
    • 5、. 二叉树中序遍历
    • 6、二叉树的后序遍历
    • 7、另一颗树的子树
  • 三、结束语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档