二叉树—leetcode

news2024/11/24 11:41:26

前言

本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目

请看完上一篇:数据结构-二叉树-CSDN博客

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

图解:

题目及其代码

题目一

​编辑

题目二

​编辑

题目三

​编辑

题目四

题目五

​编辑

题目六


图解:

题目及其代码

题目一

965. 单值二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/univalued-binary-tree/description/

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

输入:[2,2,2,5,2]
输出:false

提示:

  1. 给定树的节点数范围是 [1, 100]
  2. 每个节点的值都是整数,范围为 [0, 99] 。
// 函数声明:检查给定的二叉树根节点是否代表一个单值树
bool isUnivalTree(struct TreeNode* root) {
    // 如果根节点为空,也认为它是单值树(空树可以视为所有节点值都相同的情况)
    if (root == NULL)
        return true;

    // 检查左子树:如果存在左子节点,并且其值不等于根节点的值,则返回false
    if (root->left && root->left->val != root->val)
        return false;

    // 检查右子树:如果存在右子节点,并且其值不等于根节点的值,则返回false
    if (root->right && root->right->val != root->val)
        return false;

    // 递归检查左子树和右子树是否也都是单值树
    // 只有当左右子树都是单值树,并且它们的值与当前根节点的值相同时,整个树才是单值树
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

题目二

100. 相同的树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/same-tree/description/

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //判断是否都为NULL,注意:两个为NULL也算相等
    if (p == NULL && q == NULL)
        return true;
    //判断一个为NULL,一个不为NULL
    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);
}

题目三

101. 对称二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/description/

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //判断是否都为NULL,注意:两个为NULL也算相等
    if (p == NULL && q == NULL)
        return true;
    //判断一个为NULL,一个不为NULL
    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);
}

题目四

144. 二叉树的前序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

94. 二叉树的中序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-inorder-traversal/description/

145. 二叉树的后序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

这个三个OJ写法差不多只需要改变一点就能实现

// 前序遍历二叉树的辅助函数
// 参数:
// - root: 当前正在访问的二叉树节点指针
// - arr: 用于存储遍历结果的整型数组
// - i: 指向当前数组索引的指针,用于在遍历时追踪下一个存储位置
void Tree_preorder(struct TreeNode* root, int* arr, int* i){
    // 如果当前节点为空,则直接返回,结束当前递归路径
    if(root == NULL)
        return;
    
    // 将当前节点的值存入数组,并递增索引i(使用指针解引用后加法,避免了直接传值的问题)
    arr[(*i)++] = root->val;
    
    // 递归遍历左子树
    Tree_preorder(root->left, arr, i);
    
    // 递归遍历右子树
    Tree_preorder(root->right, arr, i);
}

// 计算二叉树的节点总数
// 参数:
// - root: 二叉树的根节点指针
// 返回值:
// - 树的节点总数,空树返回0
int Treesize(struct TreeNode* root){
    // 递归终止条件:如果树为空,返回0
    return root == NULL ? 0 : 
           // 否则,节点总数等于左子树节点数 + 右子树节点数 + 1(根节点)
           Treesize(root->left) + Treesize(root->right) + 1;
}

// 主要函数:执行二叉树的前序遍历并返回结果数组
// 参数:
// - root: 二叉树的根节点指针
// - returnSize: 输出参数,返回数组的实际元素数量
// 返回值:
// - 存储前序遍历结果的数组指针
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    // 首先,计算二叉树的总节点数,用于动态数组的分配
    *returnSize = Treesize(root); // 通过树的节点个数,确定数组大小
  
    // 根据节点总数动态分配内存给数组arr
    int *arr = (int*)malloc(sizeof(int)*(*returnSize));
    
    // 初始化索引变量i为0,用于记录数组中的当前位置
    int i = 0;
    
    // 调用前序遍历的辅助函数填充数组
    Tree_preorder(root, arr, &i);
    
    // 完成遍历后,返回存储了前序遍历结果的数组
    return arr;
}

 

题目五

572. 另一棵树的子树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/subtree-of-another-tree/

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
// 函数:判断两棵二叉树是否相同
// 参数:p 和 q 分别表示两棵树的根节点
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    // 如果两棵树的当前节点都为NULL,说明已遍历完且两者结构相同,返回true
    if (p == NULL && q == NULL)
        return true;
    // 如果只有一个节点为NULL,说明两棵树结构不同,返回false
    if (p == NULL || q == NULL)
        return false;
    // 检查当前节点的值是否相等,如果不等则两棵树不相同,返回false
    if (p->val != q->val)
        return false;
    // 递归检查左右子树是否也相同,只有都相同才返回true
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

// 函数:判断一棵树中是否存在和另一棵树相同的子树
// 参数:root 是大树的根节点,subRoot 是要查找的子树的根节点
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    // 如果大树的当前节点为空,说明没有找到子树,返回false
    if (root == NULL) {
        return false;
    }
    // 如果大树的当前节点与子树的根节点值相等,
    // 进一步检查以当前节点为根的子树是否与subRoot相同
    if (root->val == subRoot->val &&  isSameTree(root, subRoot)) {
        // 如果相同,返回true
        return true;
    }
    // 在当前节点的左子树和右子树中递归查找子树subRoot
    // 使用逻辑或操作,只要一边存在匹配即返回true
    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

题目六

二叉树遍历_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1

输入:

abc##de#g##f###

输出:

c b e g d f a 

#include <stdio.h>
#include <stdlib.h>

// 更改基本数据类型名称为DataType以增强代码可读性
typedef char DataType;

// 定义二叉树节点结构体,包含节点值(data)及左右子节点指针
typedef struct TreeNode {
    DataType data; // 节点存储的数据,原代码中的val改为data以增强理解
    struct TreeNode* left; // 左子节点指针
    struct TreeNode* right; // 右子节点指针
} TreeNode;

// 创建二叉树的函数,接收字符串表示的树结构和当前字符索引指针
// 字符串中'#'表示空节点,其他字符表示节点值
TreeNode* CreateTree(char* p, int* pi) {
    // 当遇到 '#',表示当前节点为空,索引加一后返回NULL
    if (p[*pi] == '#') {
        (*pi)++;
        return NULL;
    }
    // 动态分配新节点内存,检查是否分配成功
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    if (!root) { // 内存分配失败处理
        fprintf(stderr, "Memory allocation failed\n");
        exit(EXIT_FAILURE); // 程序退出
    }
    // 初始化节点值,并递增索引指向下一个字符
    root->data = p[(*pi)++];
    // 递归创建左子树和右子树
    root->left = CreateTree(p, pi);
    root->right = CreateTree(p, pi);
    return root; // 返回当前创建的节点
}

// 中序遍历二叉树的函数,按照“左-根-右”的顺序访问每个节点
void InOrder(TreeNode* root) {
    if (root == NULL) return; // 遇到空节点直接返回,结束递归
    InOrder(root->left);    // 先遍历左子树
    printf("%c ", root->data); // 打印当前节点值
    InOrder(root->right);   // 最后遍历右子树
}

int main() {
    char arr[100]; // 用于存储输入的二叉树字符串表示
    int i = 0;     // 索引变量,用于追踪字符串中的当前字符位置
    // 从用户输入中读取二叉树的字符串表示
    scanf("%s", arr);
    // 根据输入字符串创建二叉树
    TreeNode* root = CreateTree(arr, &i);
    // 对创建的二叉树进行中序遍历并打印节点值
    InOrder(root);

    return 0; // 程序正常结束
}

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

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

相关文章

Zynq7000 系列FPGA模块化仪器

• 基于 XilinxXC7Z020 / 010 / 007S • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 FPGA 控制器 Zynq7000 系列模块是基于 Xilinx XC7Z020/010/007S 全可编程片上系统 (SoC) 的…

LLM的基础模型8:深入注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)

1.需求分析&#xff1a; 我们现在已经能够让这片地形出现在任意地方&#xff0c;只要角色走在这片地形上&#xff0c;就能够产生痕迹&#xff0c;但这片区域总是需要人工指定&#xff0c;又无法把这片区域无限扩大&#xff08;显存爆炸&#xff09;&#xff0c;因此尝试使角色无…

【BUG】已解决:Could not find a version that satisfies the requirement tensorflow

已解决&#xff1a;Could not find a version that satisfies the requirement tensorflow 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;同时是武汉城市开发者社区主理人 擅长.net、C…

Java抽象队列同步器AQS

AQS介绍 AQS是一个抽象类&#xff0c;主要用来构建锁和同步器。 public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { }AQS为构建锁和同步器提供了一些通用功能的实现&#xff0c;因此&#xff0c;使用…

基于STM32开发的智能语音助理系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 目录 引言环境准备智能语音助理系统基础代码实现&#xff…

BFS实现图的点的层次-java

加强对广度优先搜索的理解&#xff0c;其实就是主要的3个步骤&#xff0c;外加数组模拟单链表是基础&#xff0c;要搞懂。 目录 前言 一、图中点的层次 二、算法思路 1.广度优先遍历 2.算法思路 三、代码如下 1.代码如下&#xff08;示例&#xff09;&#xff1a; 2.读入…

【Python教程】2-函数、逻辑运算与条件判断

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

0基础学习区块链技术——入门

大纲 区块链构成区块链相关技术Hash算法区块链区块链交易 参考资料 本文力求简单&#xff0c;不讨论任何技术细节&#xff0c;只是从简单的组成来介绍区块链技术&#xff0c;以方便大家快速入门。同时借助一些可视化工具&#xff0c;辅助大家有直观的认识。 区块链构成 顾名思…

一文掌握Vue3:深度解读Vue3新特性、Vue2与Vue3核心差异以及Vue2到Vue3转型迭代迁移重点梳理与实战

每次技术革新均推动着应用性能与开发体验的提升。Vue3 的迭代进步体现在性能优化、API重构与增强型TypeScript支持等方面&#xff0c;从而实现更高效开发、更优运行表现&#xff0c;促使升级成为保持竞争力与跟进现代前端趋势的必然选择。本文深度解读Vue3 响应式数据data、生命…

④-1单细胞学习-cellchat单数据代码补充版

目录 1&#xff0c;数据输入及处理 ①载入包和数据 ②CellChat输入数据准备 ③构建CellChat对象 ④数据预处理 2&#xff0c;细胞通讯预测 ①计算细胞通讯概率 ②提取配受体对细胞通讯结果表 ③提取信号通路水平的细胞通讯表 ④细胞互作关系可视化 1&#xff09;细胞…

服务器部署spring项目jar包使用bat文件,省略每次输入java -jar了

echo off set pathC:\Program Files\Java\jre1.8.0_191\bin START "YiXiangZhengHe-8516" "%path%/java" -Xdebug -jar -Dspring.profiles.activeprod -Dserver.port8516 YiXiangZhengHe-0.0.1-SNAPSHOT.jar 将set path后面改成jre的bin文件夹 START 后…

数据:人工智能的基石 | Scale AI 创始人兼 CEO 亚历山大·王的创业故事与行业洞见

引言 在人工智能领域&#xff0c;数据被誉为“新石油”&#xff0c;其重要性不言而喻。随着GPT-4的问世&#xff0c;AI技术迎来了新的浪潮。众多年轻创业者纷纷投身这一领域&#xff0c;Scale AI的创始人兼CEO亚历山大王&#xff08;Alexander Wang&#xff09;就是其中的佼佼…

推荐4个好用有趣的软件

MyComic——漫画聚合软件 MyComic是一款界面简洁、分类详尽的漫画阅读软件&#xff0c;专为动漫爱好者设计。它提供了丰富的高清漫画资源&#xff0c;支持在线免费阅读&#xff0c;并且可以一键下载到书架&#xff0c;方便随时离线观看&#xff0c;节省流量。用户可以轻松找到喜…

5分钟快速带了解fl studio21破解汉化版安装激活指南

随着数字音乐制作的快速发展&#xff0c;越来越多的音乐制作软件涌现出来&#xff0c;而FL Studio无疑是其中的佼佼者。作为一款功能强大、易于上手的音乐制作软件&#xff0c;FL Studio V21中文版在继承了前代版本优秀基因的基础上&#xff0c;进一步提升了用户体验&#xff0…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗&#xff1f;在使用电脑过程中&#xff0c;很多小伙伴都不重视电脑的回收站,&#xff0c;有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里&#xff0c;可回收站已经被清空了……那…

IC元器件

1.电阻&#xff1a; 电阻的作用&#xff1a; 1.与负载串联&#xff1a;做限流分压 2.电阻并联&#xff1a;将小功率电阻并联成大功率&#xff0c;防烧毁 2.电容&#xff1a; 电容就是两块导体&#xff0b;中间的绝缘材料&#xff08;相当于两个人坐在一起加上中间的空…

基于vue的音乐播放器的设计与实现(论文+源码)_kaic

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

【Apache Doris】周FAQ集锦:第 5 期

【Apache Doris】周FAQ集锦&#xff1a;第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

Python第二语言(六、Python异常)

目录 1. 捕获异常&#xff08;try: except: else: finally:&#xff09; 1.1 概念 1.2 基础语法&#xff08;try&#xff1a; except&#xff1a;&#xff09; 1.3 捕获异常&#xff08;异常也有类型&#xff09; 1.4 捕获多个异常&#xff08;try&#xff1a;except(Name…