【初阶数据结构】9.二叉树(4)

文章目录

  • 5.二叉树算法题
    • 5.1 单值二叉树
    • 5.2 相同的树
    • 5.3 另一棵树的子树
    • 5.4 二叉树遍历
    • 5.5 二叉树的构建及遍历
  • 6.二叉树选择题


5.二叉树算法题

5.1 单值二叉树

点击链接做题

img

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
typedef struct TreeNode TreeNode;
bool isUnivalTree(struct TreeNode* root) {if(root == NULL){return true;}//root不为空,把root和root->left,root->right比较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);
}

5.2 相同的树

点击链接做题

img

  1. 两棵树都为空树------相同的树

  2. 其一为空树------不是相同的树

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
typedef struct TreeNode TreeNode;
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);
}

拓展学习

对称二叉树:

点击链接做题

img

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
typedef struct TreeNode TreeNode;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->right) && isSameTree(p->right,q->left);
}bool isSymmetric(struct TreeNode* root) {return isSameTree(root->left,root->right);
}

5.3 另一棵树的子树

点击链接做题

img

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
typedef struct TreeNode TreeNode;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);
}//判断subRoot是不是root的子树
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root == NULL){return false;}if(isSameTree(root,subRoot)){return true;}//判断root的左右子树是否和subRoot一样return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

5.4 二叉树遍历

前序遍历:

点击链接做题

img

代码:

/*** 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().*/
typedef struct TreeNode TreeNode;// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){if (root == NULL){return;}//根左右arr[(*pi)++] = root->val;_preorderTraversal(root->left,arr,pi);_preorderTraversal(root->right,arr,pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {//int* returnSize是一个整型数组//1.先求出二叉树结点的个数*returnSize = BinaryTreeSize(root);//2.动态申请内容---arr的大小int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));//开始前序遍历int i = 0;_preorderTraversal(root,returnArr,&i);return returnArr;
}

中序遍历:

点击链接做题

img

代码:

/*** 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().*/typedef struct TreeNode TreeNode;// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){if (root == NULL){return;}//左根右_preorderTraversal(root->left,arr,pi);arr[(*pi)++] = root->val;_preorderTraversal(root->right,arr,pi);
}int* inorderTraversal(struct TreeNode* root, int* returnSize) {//int* returnSize是一个整型数组//1.先求出二叉树结点的个数*returnSize = BinaryTreeSize(root);//2.动态申请内容---arr的大小int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));//开始中序遍历int i = 0;_preorderTraversal(root,returnArr,&i);return returnArr;
}

后序遍历:

点击链接做题

img

代码:

/*** 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().*/
typedef struct TreeNode TreeNode;// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){if (root == NULL){return;}//左右根_preorderTraversal(root->left,arr,pi);_preorderTraversal(root->right,arr,pi);arr[(*pi)++] = root->val;
}int* postorderTraversal(struct TreeNode* root, int* returnSize) {//int* returnSize是一个整型数组//1.先求出二叉树结点的个数*returnSize = BinaryTreeSize(root);//2.动态申请内容---arr的大小int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));//开始后序遍历int i = 0;_preorderTraversal(root,returnArr,&i);return returnArr;
}

5.5 二叉树的构建及遍历

点击链接做题

img

代码:

#include <stdio.h>
typedef struct BinaryTreeNode {char data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
} BTNode;//创建节点
BTNode* buyNode(char x) {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL) {perror("malloc fail!");exit(1);}newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
}//前序遍历
BTNode* creatrTree(char* arr, int* pi) {if (arr[*pi] == '#') {//如果取到的是空字符,那么就不要创建它的根节点(*pi)++;//继续往后走return NULL;}//先创建arr[*pi]这个根节点,然后后置++,这样就到了后面的结点BTNode* root = buyNode(arr[(*pi)++]);root->left = creatrTree(arr, pi);//把根节点的左孩子当作新的根节点root->right = creatrTree(arr, pi);return root;
}//中序遍历--左根右
void InOrder(BTNode* root) {if (root == NULL) {return;}InOrder(root->left);//左printf("%c ", root->data);//中InOrder(root->right);//右
}int main() {//读取用户输入的字符串保存在字符数组中char arr[100];scanf("%s",arr);//根据字符串(前序遍历)创建二叉树int i = 0;BTNode* root = creatrTree(arr, &i);//root指向二叉树的根节点//输出二叉树的中序遍历InOrder(root);return 0;
}

6.二叉树选择题

二叉树性质

  1. 对任何一棵二叉树, 如果度为 0 其叶结点个数为n0 , 度为 2 的分支结点个数为n2 ,则有n0=n2+1

img

证明上述性质:

假设一个二叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点,则这个二叉树的边数是2a+b

另一方面,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1

结合上面两个公式:

2a+b = a+b+c-1 ,即: a = c-1

根据二叉树的性质,完成以下选择题:(答案在后面)

  1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
    A 不存在这样的二叉树
    B 200
    C 198
    D 199

n0=n2+1

  1. 在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
    A n
    B n+1
    C n-1
    D n/2

n0+n1+n2=2N:所有节点加起来2n

因为n0=n2+1,所以化简为下面的

2n0+n1-1=2N

完全二叉树中有10个,度为1的结点。

因为2N是偶数,2n0是偶数,所以n1-1也为偶数,所以n1为奇数,n1=1。

2n0=2N,n0为n个

  1. 一棵完全二叉树的结点数位为531个,那么这棵树的高度为( )
    A 11
    B 10
    C 8
    D 12

20+21+…+28+20=531

  1. 一个具有767个结点的完全二叉树,其叶子结点个数为()
    A 383
    B 384
    C 385
    D 386

2n0+n1-1=767

因为767是奇数,2n0是偶数,所以n1=0,n0=384

答案:

1.B

2.A

3.B

4.B


链式二叉树遍历选择题:(答案在后面)

  1. 某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为( )
    A ABDHECFG
    B ABCDEFGH
    C HDBEAFCG
    D HDEBFGCA
  1. 二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
    A E
    B F
    C G
    D H
  1. 设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
    A adbce
    B decab
    C debac
    D abcde
  1. 某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
    A FEDCBA
    B CBAFED
    C DEFCBA
    D ABCDEF

1.A

2.A

3.D

4.A

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

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

相关文章

虚拟机centos9搭建wordpress

目录 1. 更换yum源更新系统软件包&#xff1a; 1.1备份yum源 1.1.1创建备份目录&#xff1a; 1.1.2移动现有仓库配置文件到备份目录&#xff1a; 1.1.3验证备份&#xff1a; 1.2更换yum源 1.2.1添加yum源 1.2.2删除和建立yum缓存 1.3更新系统软件包 1.4 yum与dnf介绍…

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试

文章目录 一&#xff0c;Java中上传文件到阿里云OSS1&#xff0c;整合阿里云OSS2&#xff0c;测试上传文件 二&#xff0c;Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…

nginx的学习(二):负载均衡和动静分离

简介 nginx的负载均衡和动静分离的简单使用 负载均衡配置 外部访问linux的ip地址:80/edu/a.html地址&#xff0c;会轮询访问Tomcat8080和Tomcat8081服务。 Tomcat的准备 准备两个Tomcat&#xff0c;具体准备步骤在nginx的学习一的反向代理例子2中&#xff0c;在Tomcat8080…

告别繁琐地推!Xinstall如何一键优化你的App地推方案

在这个移动应用遍地开花的时代&#xff0c;App地推活动早已成为各大厂商获取新用户、提升品牌曝光度的重要手段。然而&#xff0c;传统地推方案中的种种弊端&#xff0c;如填写地推码/邀请码的繁琐、渠道打包的工作量繁重、人工登记上报的不准确等&#xff0c;无一不在拖慢地推…

【接口设计】学会用 RestTemplate 发请求

《接口设计》系列&#xff0c;共包含以下 5 篇文章&#xff1a; 前后端的通信方式 REST如何设计统一 RESTful 风格的数据接口为 APP、PC、H5 网页提供统一风格的 API&#xff08;实战篇&#xff0c;附源码地址&#xff09;用 Swagger 实现接口文档学会用 RestTemplate 发请求 …

【C++】选择结构案例-三目运算符

三目运算符语法格式&#xff1a; 布尔表达式?表达式1:表达式2 运算过程&#xff1a;如果布尔表达式的值为 true &#xff0c;则返回 表达式1 的值&#xff0c;否则返回 表达式2 的值 &#xff08;三目运算符指的是&#xff1f;和&#xff1a;&#xff09; 在这个三目运算符…

USB转多路串口-纯硬件实现串口数据传输指示灯电路

前言 串口相关产品往往要求有数据收发时LED闪烁&#xff0c;我们经常会用软件实现&#xff0c;在MCU内注册一个定时器&#xff0c;有数据发送时就闪烁一段时间。软件点灯这种方式存在两个缺陷&#xff0c;一是接收方向不好实现&#xff1b;二是定时器一般用固定频率&#xff0…

Redis的两种持久化方式---RDB、AOF

rdb其实就是一种快照持久化的方式&#xff0c;它会将Redis在某个时间点的所有的数据状态以二进制的方式保存到硬盘上的文件当中&#xff0c;它相对于aof文件会小很多&#xff0c;因为知识某个时间点的数据&#xff0c;当然&#xff0c;这就会导致它的实时性不够高&#xff0c;如…

Nature Electronics|柔性可吞服电子设备用于胃部电生理学监测(柔性健康监测/可吞服电子/柔性

美国麻省理工学院David H. Koch 综合癌症研究所的 Giovanni Traverso团队,在《Nature Electronics》上发布了一篇题为“An ingestible device for gastric electrophysiology”的论文。论文内容如下: 一、 摘要 从胃肠道和肠道神经系统记录高质量电生理数据的能力有助于了解…

信通院发布!首个大模型混合云标准

近日&#xff0c;中国信通院发布了首个大模型混合云标准&#xff0c;通过定位当前大模型混合云的能力水平&#xff0c;为基于混合云的大模型服务实践提供指引&#xff0c;并明确未来提升方向。同时&#xff0c;中国信通院基于标准展开大模型混合云能力成熟度专项测试&#xff0…

生信技能54 - WisecondorX多线程并行分析CNV

WisecondorX分析CNV,默认单样本分析,batch_analysis参数设置为True可启动多样本并行分析。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动化批量npz转换和reference构建 github: https://github.com/CenterForMedicalGe…

Windows 安装 PostgreSQL 并安装 vector 扩展

目录 前言 下载安装 pgAdmin 4 vector 扩展 前言 调研大模型时&#xff0c;了解到一些大模型的应用&#xff0c;其中一个就是知识库&#xff0c;用户可以上传文档到知识库中&#xff0c;系统解析文档并将内容向量化保存起来&#xff0c;以便在和模型交互时使用。 在和大模…

【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分&#xff1a;读锁&#xff0c;写锁 对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写&#xff0c;读-写操作或写-写操作这些情况可能会引起一些问题&#xff0c;需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时&#x…

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具&#xff0c;利用AI&#xff0c;将款选中的对象快速的提取选区&#xff0c;测试了一下&#xff0c;选区制作的非常nice快速选择工具 跟磁性套索类似&#xff0c;自动识别颜色相似…

如何快速抓取小红书帖子评论?两大实战Python技巧揭秘

摘要&#xff1a; 本文将深入探讨两种高效的Python方法&#xff0c;助您迅速获取小红书文章下方的所有评论&#xff0c;提升市场分析与用户洞察力。通过实战示例与详细解析&#xff0c;让您轻松掌握数据抓取技巧&#xff0c;为您的内容营销策略提供有力支持。 如何快速抓取小…

C++ | Leetcode C++题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; template <class T> class PeekingIterator : public Iterator<T> { public:PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {flag Iterator<T>::hasNext();if (flag) {nextElement Ite…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧&#xff0c; 可以实现同一个ShaderGraph&#xff0c;同一个Material材质球&#xff0c; 但使用不同的Texture贴图&#xff0c;而Sprite显示不会相互覆盖。 具体实现方法如下&#xff1a; 声明Texture2D时&#xff0c;把名字命名成&#xff1a…

如何设置postgresql数据库的账户密码

说明&#xff1a;在我的云服务器上&#xff0c;postgres是使用yum的方式安装的&#xff0c;不需要设置postgres账户的密码&#xff0c;本文介绍安装后如何手动设置postgres账户的密码&#xff1b; postgres数据库安装&#xff0c;参考下面这篇文章&#xff1a; PostgreSQL安装…

SMS-Activate 接码

pip install smsactivate from smsactivate.api import SMSActivateAPI 1. 获取密匙 在https://sms-activate.io/cn/api2#balans页面点击生成密匙 2. 查看所需服务的代码符号&#xff0c;点击见表 查看国家代码符号点击见表 3. 获取手机号 def get_phone_new(self):api SMS…

Intel任命Micron技术开发主管领导Intel Foundry制造运营

- **新闻要点**&#xff1a;Intel聘请了Micron的技术开发主管Dr. Naga Chandrasekaran担任首席全球运营官、执行副总裁以及Intel Foundry制造和供应链组织的总经理。他将负责Intel的所有制造运营事务。 #### 任命背景 - **领导团队**&#xff1a;Chandrasekaran将成为Intel执行…