二叉树OJ刷题与讲解

news2024/11/14 15:12:40

1.单值二叉树

题目链接:单值二叉树

题目描述:

这道题要求判断是否是单值二叉树也就是说每个节点的值都要相等才是单值二叉树,如果相等就返回true否则返回false,我们可以使用递归来解这道题,我们把它分为根左子树右子树,判断孩子和父亲是否相等若相等进行下次递归,直到节点为空。

代码如下:

/**
 * 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 && root->val != root->left->val)
        return false;
    if(root->right && root->val != root->right->val)
        return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.检查两颗树是否相同

题目链接:相同的树

题目描述:

我们可以分别让两颗子树遍历,然后进行判断如果不相等就返回false,若是有一颗子树先为空那也是不相等返回false,直到两颗子树都为空那就说明都相等返回true

代码如下:

/**
 * 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. 对称二叉树

题目链接:对称二叉树

题目描述:

这道题要判断的是左子树和右子树要相等,那么我们可以通过上面那道题来帮助我们判断只要把根的左子树和根的右子树传过去就行

代码如下: 

/**
 * 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->right) && isSameTree(p->right,q->left);
 }
bool isSymmetric(struct TreeNode* root) {
    if(root == NULL)
        return true;
    
    if(root->val == root->val && isSameTree(root->left,root->right))
        return true;
    return false;
}

注意:这里要判断的是左子树和右子树是否相等,不是左子树和左子树是否相等,因为要判断是否对称


4.二叉树中序遍历

题目链接:二叉树中序遍历

题目描述:

代码如下:

/**
 * 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 TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left)+TreeSize(root->right)+1;
}
void InOrder(struct TreeNode* root,int* a,int* pi)
{
    if(root == NULL)
        return;
    InOrder(root->left,a,pi);
    a[(*pi)++] = root->val;
    InOrder(root->right,a,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int i = 0;
    int*a = (int*)malloc(sizeof(int)*(*returnSize));
    InOrder(root,a,&i);
    return a;
}

首先我们要知道returnSize表示的是数组元素个数,这里传过来的是一个指针类型的变量,因为函数外面可能会用到这个值,而return只能返回一个值,所以这里传地址过来是想形参改变实参,题目要求把中序遍历的结果存放在一个数组中所以我们要开辟空间,那么开辟多少空间合适呢我们可以求一下节点个数然后来申请,求节点个数也是非常简单我们用*returnSize接收,接着创建数组,进行中序遍历,这里需要定义一个函数专门用来中序遍历,因为遍历二叉树需要递归。


5.另一颗树的子树

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

题目描述:

代码如下:

/**
 * 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;
    if(root->val == subRoot->val && isSameTree(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

判断一棵树是否与另一颗树的子树相同,也就是说root的子树是否和subroot相同,我们这里用到了上面写的代码,我们需要依次递归左子树和右子树来进行判断是否与subroot相同,只要有一颗子树相同就说明是另一颗树的子树则返回true,如果判断到为空了就说明遍历了一遍没有找到与subroot相同的子树返回false


6.二叉树的构建及遍历

题目链接:二叉树遍历

题目描述:

代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeBNode
{
	BTDataType data;
	struct BinaryTreeBNode* left;
	struct BinaryTreeBNode* right;
}BTNode;
BTNode* CreateTree(char* arr,int* pi)
{
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    if(arr[(*pi)] == '#')
    {
        (*pi)++;
        return NULL;
    }
    root->data = arr[(*pi)++];
    root->left = CreateTree(arr,pi);
    root->right = CreateTree(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 a[100];
   scanf("%s",a);
   int i = 0;
   BTNode* root = CreateTree(a,&i);
   InOrder(root);
    return 0;
}

输入的字符串存放在数组中,我们需要创建二叉树,使用递归进行创建,定义一个树的节点,每次申请一个节点,如果读取到‘#’就跳过,进行下一次读取,把从数组中读取到的字符存放在data中,依次创建左子树右子树,最后用中序进行打印。

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

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

相关文章

Bean对象生命周期流程图

Bean生命周期流程图&#xff1a;https://www.processon.com/view/link/5f8588c87d9c0806f27358c1 Spring扫描底层流程&#xff1a;https://www.processon.com/view/link/61370ee60e3e7412ecd95d43

EmguCV学习笔记 VB.Net 4.5 像素距离和连通区域

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

【数据结构与算法 | 图篇】最小生成树之Kruskal(克鲁斯卡尔)算法

1. 前言 克鲁斯卡尔算法&#xff08;Kruskals algorithm&#xff09;是一种用于寻找加权图的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的经典算法。这种算法是由约瑟夫克鲁斯卡尔&#xff08;Joseph Kruskal&#xff09;提出的&#xff0c;并且适用于所有…

七夕情人节动态花瓣表白网页源码

软件介绍 七夕情人节动态花瓣表白网页源码是一款功能强大的表白网页程序&#xff0c;拥有超级好看的花瓣表白效果和多种不同的动态切换效果&#xff0c;非常适合七夕表白活动。 拥有独特的设计风格和花瓣表白效果&#xff0c;可以让用户在表白过程中更加浪漫和温馨。该程序还…

Seaborn:基于 Matplotlib 的高级绘图库,提供了更高级的接口来绘制吸引人的统计图形。

引言 Seaborn 是基于 Matplotlib 的高级数据可视化库&#xff0c;专为绘制统计图形而设计。相比于 Matplotlib&#xff0c;Seaborn 提供了更高级的接口&#xff0c;简化了绘图过程&#xff0c;同时默认的美观配色和样式使得图形更加吸引人。Seaborn 特别适合用于探索性数据分析…

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁)

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材…

springsecurity 登录认证一(ajax)

一、准备工作 1.1 导入依赖 因springboot 3.0 以上版本只能支持java17 顾使用2.5.0 版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><…

CSDN AI-WEB-1.0 攻略

找到一个目标靶场的IP &#xff0c; 这里以172.16.1.98 为例 1、使用命令 /robots.txt 来确定目录 2、分别测试两个文件 均无法访问&#xff0c;可返回其根目录查询 3、到根目录&#xff0c;出现搜索框 4、输入ID为1 5、使用虚拟机kali的终端 搜索命令 dirsearch -u http:…

Python青少年简明教程:基础知识

Python青少年简明教程&#xff1a;基础知识 Python是大小写敏感的语言。编程语言中的“大小写敏感”意味着该语言在识别标识符、关键字或者其他语法元素时&#xff0c;会区分字母的大小写。在这种语言中&#xff0c;大写字母和小写字母被视为不同的字符&#xff0c;因此&#x…

[论文翻译]使用 BERT 检测安卓恶意软件

Android Malware Detection Using BERT Souani B, Khanfir A, Bartel A, et al. Android malware detection using bert[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2022: 575-591. 摘要 在本文…

cad文件被写保护怎么解除保护?

CAD文件被写保护怎么解除保护?四五设计网小编给大家整理出的方法希望能够帮助到大家&#xff01; 解除CAD文件写保护的最简单方法是创建一个文件的副本&#xff0c;并在副本上进行编辑。 原文件可能因为文件属性或权限设置而被设置为写保护。创建副本不会改变原始文件的保护…

指针详解(六)

目录 1. sizeof 和 strlen 1&#xff09;sizeof 2&#xff09;strlen 3&#xff09;sizeof 和 strlen的区别 2. 数组和指针试题解析 1&#xff09;一维数组 2&#xff09;字符数组 3&#xff09;二维数组 3. 指针运算试题解析 1. sizeof 和 strlen 1&#xff09;sizeo…

【hot100篇-python刷题记录】【全排列】

R5-回溯篇 思路也是如下&#xff1a; 层层固定 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:#x代表当前固定/选择的数的下标def dfs(x):if xlen(nums)-1:ret.append(list(nums))returnfor i in range(x,len(nums)):#交换&#xff0c;将nums[i]固…

SAP_MM模块-MASS批量操作技巧

业务背景: 现在想要获得平台的流量券,每天必须要发两篇文章才行,但是一天发两篇的话,按照我的写作风格,很难写得出来~~我又不想把原本一篇完整的文章给拆分开来,那怎么办呢??今天就讲一下我常用的批量操作事务码MASS吧。 一、功能概述; MASS是系统标准的批量操作程序,…

HCIP第十一(生成树基础知识点)

企业网三层架构-冗余&#xff08;线路&#xff0c;设备&#xff0c;网关&#xff0c;电源Ups&#xff09; 三层架构-冗余&#xff0c;线路冗余&#xff1a;二层桥接技术 一台交换机上的一个接口可以映射多个MAC地址&#xff0c;但是一个MAC地址只能对应一个接口 当交换机触环…

2024.8.19 学习记录 —— 作业

一、TCP机械臂测试 #include <myhead.h>#define SER_PORT 8888 // 与服务器保持一致 #define SER_IP "192.168.0.114" // 服务器ip地址int main(int argc, const char *argv[]) {// 创建文件描述符打开键盘文件int fd open("/dev/input/event1…

设备实时数据采集:开启制造业智能化、自动化的新篇章

传统制造业在进行生产过程中&#xff0c;会涉及到设备实时数据采集需求&#xff0c;这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求&#xff1a; 1.生产数据&#xff1a;包括生产数量、生产批次、生产速度等&…

Facebook与区块链:社交网络如何融入去中心化技术

随着区块链技术的飞速发展&#xff0c;去中心化理念逐渐渗透到各个领域&#xff0c;社交网络也不例外。作为全球领先的社交平台&#xff0c;Facebook在这一趋势下开始积极探索区块链技术的潜力&#xff0c;希望利用这一前沿技术来提升平台的安全性、透明度和用户控制权。本文将…

Maven-02.介绍安装

一.介绍 首先从本地仓库中寻找所需要的jar包&#xff0c;如果没有就从中央仓库中寻找。然后从中央仓库中下载使用。但是中央仓库的服务器在国外&#xff0c;因此速度和稳定性都不好&#xff0c;因此我们在中间设立远程仓库&#xff08;私服&#xff09;&#xff0c;远程仓库一般…

光伏气象站——提升光伏发电效率和稳定运行

光伏气象站作为现代光伏电站的必备组成部分&#xff0c;‌特别适用于地理分布广泛、‌气象条件复杂多变的地区&#xff0c;‌如山区、‌森林或分散的屋顶安装等。‌这些地方由于可能存在微气候差异&#xff0c;‌对光伏系统的运行效率和性能有着显著影响。‌因此&#xff0c;‌…