二叉树相关OJ题

news2024/11/27 0:32:48

                                                       创作不易,感谢三连!! 

一、选择题

1、某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A.不存在这样的二叉树
B.200
C.198
D.199
解析:选B,根据n0=n2+1的结论(这个结论不清楚的看博主的关于二叉树概念的文章有证明),就是度为0的节点始终比度为2的节点多一个,所以这题就很显然选B了!!

2、在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A n
B n+1
C n-1
D n/2
解析:选A ,原因如下

3、一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12
解析:选B,根据结论——满二叉树的节点N数量=2^h-1,如果高度为8,那么节点最多有255个,当高度为10时,节点最多有1023个,所以高度只能是10

4、一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386
解析:选B,因为度为2的节点数肯定并度为0的节点数少1个,所以n0和n2一个是奇数一个是偶数,所以n1只能是偶数,又因为完全二叉树n1只有可能是0或者1,所以n1只能取0,所以n0=384,n2=383

5、一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为()。
A(11 5 7 2 3 17)
B(11 5 7 2 17 3)
C(17 11 7 2 3 5)
D(17 11 7 5 3 2)
E(17 7 11 3 5 2)
F(17 7 11 3 2 5)

解析:选C 先画出来,再不断向下调整

6、最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()
A[3,2,5,7,4,6,8]
B[2,3,5,7,4,6,8]
C[2,3,4,5,7,8,6]
D[2,3,4,5,6,7,8]
 解析:选C,还是画出来再调整

二、单值二叉树

OJ:单值二叉树

bool isUnivalTree(struct TreeNode* root)
{
   if(root==NULL)//a==b,a==c,->b==c
   return true;
   if(root->left&&root->left->val!=root->val)
   return false;
   if(root->right&&root->right->val!=root->val)
   return false;
   return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

三、检查两棵树是否相同

OJ:判断两棵树是否相同

这个在博主讲解二叉树链式存储中有仔细分析过了!!

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);
}

四、对称二叉树

 OJ:对称二叉树

 

bool _isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot)
{
    //都为空,对称
    if(leftroot==NULL&&rightroot==NULL)
    return true;
    //一个为空一个不为空,不对称
    if(leftroot==NULL||rightroot==NULL)
    return false;
    //都不为空,就可以看值了,如果值不相等,不对称
    if(leftroot->val!=rightroot->val)
    return false;
    //此时都不为空,且值相等,就走递归找下一个
    //左树的左子树要跟右树的右子树相比
    //左树的右子树要跟右树的左子树相比
    return _isSymmetric(leftroot->left,rightroot->right)&&
           _isSymmetric(leftroot->right,rightroot->left);
}

bool isSymmetric(struct TreeNode* root) 
{
  if(root==NULL)
  return true;
  //根不对称,就去找左右子树比 相当于是拆成两棵树的了
  return _isSymmetric(root->left,root->right);
}

五、二叉树的前序遍历

OJ:二叉树的前序遍历

int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorder(struct TreeNode* root,int *a,int *i)
{
          if(root==NULL)
          return ;
          a[(*i)++]=root->val;
          _preorder(root->left,a,i);
          _preorder(root->right,a,i);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    //returnsize是结点数
    *returnSize=TreeSize(root);
     int *a=(int *)malloc(*returnSize*sizeof(int));
     int i=0;
     _preorder(root,a,&i);
     return a;
}

六、二叉树的中序遍历

OJ:二叉树的中序遍历

int i=0;
 int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void _inorderTraversal(struct TreeNode* root,int *a)
{
          if(root==NULL)
          return ;
          _inorderTraversal(root->left,a);
          a[i++]=root->val;
          _inorderTraversal(root->right,a);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) 
{
     //returnsize是结点数
    *returnSize=TreeSize(root);
     int *a=(int *)malloc(*returnSize*sizeof(int));
     i=0;//全局变量一定要记得赋0
     _inorderTraversal(root,a);//必须构造新函数去递归,因为在原函数递归会不断创建新的数组
     return a;
}

注:这题跟上题是差不多的,我稍微改了一下,这里数组的下标我不用指针去接受参数了,而是直接设置一个全局变量i!!要注意的是,因为力扣的测试可能会多次调用这个函数,所以我们一定要在递归函数运行前让i=0!!否则就会i就会一直叠加下去导致越界!! (还有一个注意事项就是,这里千万不要使用静态的局部变量,虽然他也同样可以在函数栈帧销毁时不被释放,但是他的作用域很小,不能让我们在主函数中让i=0)

但是尽量少使用全局变量!!

七、二叉树的后序遍历

OJ:二叉树的后序遍历

void _postorder(struct TreeNode* root,int *arr,int *arrsize)
{
    if(root==NULL)
    return;
    _postorder(root->left,arr,arrsize);
    _postorder(root->right,arr,arrsize);
    arr[(*arrsize)++]=root->val;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize) 
{
    int *arr=(int*)malloc(100*sizeof(int));
    *returnSize=0;
     _postorder(root,arr,returnSize);
    return arr;
}

 注:这题和前两题差不多,但是又进行了改进,我们发现了题目的一个条件

      也就是说我们动态开辟100个空间的话是绝对不会越界的,所以就不需要通过自己封装一个treesize函数来计算节点个数数量了!! 那我们要怎么去让returnsize返回节点个数的值的??方法就是把*returnsize初始化为0作为下标,每次放进一个值的时候*returnsize就会++一次,当后序遍历结束的时候,returnsize恰好又多+了一次,正好表示节点个数的数量!!

八、另一颗树的子树

OJ:另一颗树的子树

 

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是至少有一个节点的。
     if(isSametree(root,subRoot))
     return true;
     return isSubtree(root->left, subRoot)||isSubtree(root->right, subRoot);
     //左子树和右子树只要有一个找到了,就返回true
}

        关键就是我们每遍历到一个节点,都要尝试把他往下遍历去和另外一个子树进行比较!!所以单独封装了一个比较两个树是否相同的函数,该树每遍历一次节点就去调用一次,最后在用||操作符,因为左子树和右子树只要有一个找到就可以了!!

九、二叉树的构建及遍历

OJ:二叉树的构建及遍历

typedef char BTDataType;
typedef struct BTtreeNode
{
    BTDataType val;
    struct BTtreeNode*left;
    struct BTtreeNode*right;
}BTtreeNode;

BTtreeNode* BuyNode(BTDataType x)
{
    BTtreeNode*newnode=(BTDataType*)malloc(sizeof(BTDataType));
      newnode->left=newnode->right=NULL;
      newnode->val=x;
      if(newnode==NULL)
      {
        perror("malloc fail");
        exit(1);
      }
      return newnode;
}

BTtreeNode* CreateTree(BTDataType*a,int *pi)
{
    if(a[*pi]=='#')
    {
    (*pi)++;
    return NULL;
    }
    BTtreeNode*root=BuyNode(a[(*pi)++]);
    root->left=CreateTree(a,pi);
    root->right=CreateTree(a,pi);
    return root;
}

void InOrder(BTtreeNode*root)
{
    if(root==NULL)
    return;
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main()
{
    char arr[100];
    scanf("%s",arr);
    int i=0;
    BTtreeNode*root=CreateTree(arr,&i);
    InOrder(root);
    printf("\n");
    return 0;
}

这题就是将二叉树的构建和链式结构的中序遍历结合起来了!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1450747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

致创新者:聚焦目标,而非问题

传统的企业创新管理方式常常导致组织内部策略不协调、流程低效、创新失败率高等问题。而创新运营作为企业管理创新的新模式,通过整合文化、实践、人员和工具,提高组织创新能力。已经采用创新运营的公司报告了一系列积极的结果,如市场推出速度…

最长连续手牌 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为 0−9 中的一个。游戏开始时玩家从手牌中…

力扣hot3--并查集+哈希

第一想法是排个序然后遍历一遍,but时间复杂度就超啦 并查集居然与哈希结合了() 已经好久没用过并查集了,,,我们用哈希表f_node中来记录原结点的父节点,其中key是原结点,value是父节点…

OpenHarmony—UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,…

代码随想录算法训练营第二十七天|贪心算法理论基础,455.分发饼干,376. 摆动序列,53. 最大子序和

系列文章目录 代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

抖音私信自动回复工具使用教程!

该工具基于网页版抖音,可以用于抖音个人号等任何权限的账号! 获取软件 联系我的v 信:llike620 基本使用 了解GPT的,可以配置FastGPT这种训练知识库的AI进行回复 不了解的,可以配置关键词回复 点击抖音私信按钮&a…

Linux设置jar包开机自启动

步骤 1、新建jar包自启文件 sudo vi /etc/init.d/jarSysInit.sh 按i键进入编辑模式输入以下内容: export JAVA_HOME/home/jdk/jdk-11.0.22 export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH$PATH:$JAVA_…

H5大气的互联网建站服务公司静态HTML网站模板源码

H5大气的互联网建站服务公司静态HTML网站模板源码 源码介绍:一款大气的互联网建站服务公司/工作室静态HTML网站模板,带有多个单页,可自行二开作为工作室或公司官网。 下载地址: https://www.changyouzuhao.cn/13456.html

人力资源智能化管理项目(day08:云存储)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 存储桶列表 :登录 - 腾讯云 API密钥管理:登录 - 腾讯云 上传图片-创建腾讯云存储桶 存储桶名称:intelligentmanagement-1306913843 地…

【Qt】环境安装与初识

目录 一、Qt背景介绍 二、搭建Qt开发环境 三、新建工程 四、Qt中的命名规范 五、Qt Creator中的快捷键 六、QWidget基础项目文件详解 6.1 .pro文件解析 6.2 widget.h文件解析 6.3 widget.cpp文件解析 6.4 widget.ui文件解析 6.5 main.cpp文件解析 七、对象树 八、…

Rust中不可变变量与const有何区别?

Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust的变量。 什么是变量? 如果你初次学习编程语言,变量会是一…

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步:测试最终效果第二步:使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步:Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步:应用主题 前言 只不过是突发奇想&#xff0c…

相机图像质量研究(17)常见问题总结:CMOS期间对成像的影响--靶面尺寸

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

如何使用python在三天内制作出一个赛车游戏

制作一个赛车游戏是一个复杂的过程,涉及多个方面,如游戏设计、图形渲染、物理引擎、用户输入处理等。在三天内完成这个任务可能非常具有挑战性,特别是如果你是初学者。但如果你有基本的Python编程知识和一些游戏开发经验,以下是一…

假期day12

任务调度算法: 1.抢占式调度:高优先级的任务优先执行,并且可以打断低优先级的任务执行。 2.时间片轮转:相同优先级的任务,拥有相同的时间片(1ms),当时间片被耗尽,就退出…

Github项目推荐-Tiny-Rdm

项目地址 GitHub - tiny-craft/tiny-rdm: A Modern Redis GUI Client 项目简述 一个开源的Redis管理工具,有漂亮的界面和丰富的功能。使用的编程语言如下 项目截图

C语言第二十五弹---字符函数和字符串函数(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、字符分类函数 2、字符转换函数 3、strlen的使用和模拟实现 4、strcpy 的模拟实现 5、strcat 的模拟实现 6、strcmp 的模拟实现 7、strncpy 函数的使用 总结…

【Pygame手册02/20】pygame模块display控制窗口和屏幕

目录 一、说明二、pygame.display接口函数2.1 函数表格2.2 pygame.display的功能 三、详细的函数调用3.1 pygame.display.init()3.2 pygame.display.quit()3.3 pygame.display.get_init()3.4 pygame.display.set_mode()3.5 pygame.display.get_surface()3.6 pygame.display.fl…

qml之Control类型布局讲解,padding属性和Inset属性细讲

1、Control布局图 2、如何理解? *padding和*Inset参数如何理解呢? //main.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 1.4 import QtQml 2.12ApplicationWindow {id: windowvisible: …

ChatGPT绘图指南:DALL.E3玩法大全(二)

在前一篇文章中,我们介绍了什么是 DALL.E3 模型, DALL.E3 有什么优势,使用DALL.E3 的两种方法,以及DALL.E3 绘图的基本规则, 感兴趣的朋友请前往查看: ChatGPT绘图指南:DALL.E3玩法大全(一). 接下来&#…