【初阶数据结构】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://www.rhkb.cn/news/384592.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换

相关知识 CycleGAN 循环生成网络&#xff0c;实现了在没有配对示例的情况下将图像从源域X转换到目标域Y的方法&#xff0c;应用于域迁移&#xff0c;也就是图像风格迁移。上章介绍了可以完成图像翻译任务的Pix2Pix&#xff0c;但是Pix2Pix的数据必须是成对的。CycleGAN中只需…

杭州社保卡办理-农业银行版本

step 1、杭州滨江高新支行 被告知只能工作日办理&#xff08;由于工作时间冲突&#xff0c;办理不了&#xff09; 询问哪个支行可以办&#xff0c;回答说不知道&#xff0c;让我自己去问。银行服务态度较差。 step 2、杭州滨江江南支行 市民卡显示这家&#xff0c;周六可以…

构建现代数据湖

现代数据湖是一半数据仓库和一半数据湖&#xff0c;对所有事情都使用对象存储。使用对象存储来构建数据仓库是通过 Open Table Formats OTF&#xff09; 实现的&#xff0c;例如 Apache Iceberg、Apache Hudi 和 Delta Lake&#xff0c;这些规范一旦实现&#xff0c;就可以无缝…

K8s-控制器

一 为什么使用控制器 pod控制器 作用&#xff1a;1.pod类型资源删除&#xff0c;不会重建 2.控制器可以帮助用户监控&#xff0c;并保证节点上运行定义好的pod副本数 3.pod超过或低于用户期望&#xff0c;控制器会创建、删除pod副本数量 控制器类型&am…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

一文理解生成式AI应用的五个级别:Tool、Chatbot、Copilot、Agent 和 Intelligence

当下&#xff0c;很多人对 AI 一知半解&#xff0c;并不能很好地区分&#xff1a;Tool、Chatbot、Copilot、Agent 和 Intelligence 概念之间的区别。 最近读完 《真格基金戴雨森谈生成式AI&#xff1a;这是比移动互联网更大的创业机会&#xff0c;开始行动是关键 》 发现讲的特…

谷粒商城实战笔记-64-商品服务-API-品牌管理-OSS前后联调测试上传

文章目录 1&#xff0c;拷贝文件到前端工程2&#xff0c;局部修改3&#xff0c;在品牌编辑界面使用上传组件4&#xff0c;OSS配置允许跨域5&#xff0c;测试multiUpload.vue完整代码singleUpload.vue完整代码policy.js代码 在Web应用开发中&#xff0c;文件上传是一项非常常见的…

AC695x BLE OTA调试

SDK版本&#xff1a;AC695N_soundbox_sdk_release_3.1.0AC695x SDK支持BLE OTA升级&#xff0c;使用杰理公版APP升级即可。SDK需要做一些调整&#xff0c;板级文件需要增加如下配置&#xff0c;使能OTA升级 #define TCFG_APP_BT_EN 1#define APP_UPDATE_EN …

ctfshow web入门 中期测评 web492--web502

web492 <?php include(render/render_class.php); include(render/db_class.php);$action$_GET[action]; if(!isset($action)){header(location:index.php?actionlogin);die(); }if($actioncheck){extract($_GET);if(preg_match(/^[A-Za-z0-9]$/, $username)){$sql &qu…

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么&#xff1f; ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜&#xff0c;如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

Java基础知识(一)

面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目&#xff0c;尤其是需要维护和扩展的系统&#xff1b;而面向过程更适合小型、线性的任务或对性能要求…

1.2 单链表定义及操作实现(链式结构)

1.单链表定义 链式存储&#xff1a;用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性 表简称线性链表。 为了正确表示结点间的逻辑关系&#xff0c;在存储每个结点值的同时&#xff0c;还必须存储指示其直接 后继结点的地址&#xff08;或位置&#xff09;…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具&#xff0c;以此来达到一个内网穿透的目的。简单说一下实验滴环境吧&#xff0c;kali作为攻击机&#xff0c;winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时&#xff0c;往往会自定义一个模型类&#xff0c;这个类中定义了神经网络的结构&#xff0c;训练时将数据集输入&#xff0c;从0开始训练&#xff1b;而迁移学习中&#xff08;单指模型迁移策略&#xff09;&#x…

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…

二叉树详解-第四篇 二叉树链式结构的实现

目录 1.二叉树的遍历 1.1前序遍历&#xff1a; 1.2 中序遍历&#xff1a; 1.3 后序遍历&#xff1a; 2.二叉树链式结构的实现 2.1 Tree.h 2.2 Tree.cpp 2.2.1 前序遍历 void PreOrder(TNode* Root) 2.2.2 中序遍历 void InOrder(TNode* Root) 2.2.3 后序遍历 void Bac…

基于opencv[python]的人脸检测

1 图片爬虫 这里的代码转载自&#xff1a;http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…

微信小程序-本地部署(前端)

遇到问题&#xff1a;因为是游客模式所以不能修改appID. 参考链接&#xff1a;微信开发者工具如何从游客模式切换为开发者模式&#xff1f;_微信开发者工具如何修改游客模式-CSDN博客 其余参考&#xff1a;Ego微商项目部署&#xff08;小程序项目&#xff09;&#xff08;全网…

Wonder3D 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2310.15008 代码链接&#xff1a;https://github.com/xxlong0/Wonder3D 解决了什么问题&#xff1f; 随着扩散模型的提出&#xff0c;3D 生成领域取得了长足进步。从单张图片重建出 3D 几何是计算机图形学和 3D 视觉的基础任务&am…