正餐---二叉树的OJ题


目录​​​​​​​

前言🍯

1. 检查两颗树是否相同🥇

1.1 思路分析🪙

1.2 代码实现🧰

2. 单值二叉树🌲

2.1 思路分析🔮

2.2 代码实现💈

3. 二叉树的前序遍历🎟️

3.1 思路分析🕰️

3.2 代码实现💸

4. 翻转二叉树🏎️

4.1 思路分析💷

4.2 代码实现🛠️

5. 另一颗树的子树🚂

5.1 思路分析🛡️

5.2 代码实现🎐

 6.二叉树的构建及遍历🚃

7. 对称二叉树🚧

7.1 思路分析🧧

7.2 代码实现📆

8. 判断一颗二叉树是否是平衡二叉树🚦

8.1 思路分析🎁

8.2 代码实现🛍️

课后作业🍭

1.二叉树的后序遍历🩸

2.二叉树的中序遍历💎

 3. 二叉树最大深度🍩

3.1 思路分析

后语🍰


前言🍯

Hey,guys!又见面了,还记得上篇博客,我们干了什么吗?没错👍,我们对二叉树和堆排序相关的知识点进行了巩固复习。今天,我们的主要任务就是对递归有更深的理解,可以更好地运用递归的思想。今天主要就是二叉树的oj题。

废话不多说,我们进行今天的学习!!!


1. 检查两颗树是否相同🥇

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1.1 思路分析🪙


1.2 代码实现🧰

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 isSameTree(p->left,q->left)&&
        isSameTree(p->right,q->right);//2个都相同才返回true
    else//不相同
        return false;    
}

2. 单值二叉树🌲

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.1 思路分析🔮


2.2 代码实现💈

 bool isSameNode(struct TreeNode* root,int data)
 {
     if(root==NULL)
         return true;
     if(root->val!=data)
         return false;
     return isSameNode(root->left,data)&&
     isSameNode(root->right,data);//左右都要比较(每个节点都要比较)
 }
bool isUnivalTree(struct TreeNode* root) {
    int data=root->val;
    return isSameNode(root,data);
}

3. 二叉树的前序遍历🎟️

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

3.1 思路分析🕰️

此题需要保存节点,所以需要先获取节点个数,然后进行前序遍历,保存每一个节点值。

这也是为什么要有这道题,前序遍历的实现之前见过了,忘记的小伙伴再去看看吧。

3.2 代码实现💸

 //节点个数 = 左右子树节点个数 + 1
 int BzSize(struct TreeNode* root)
 {
     if(root==NULL)
         return 0;
     return BzSize(root->left)+BzSize(root->right)+1;
 }
 //前序遍历+保存
void ProeOrder(struct TreeNode* root,int* a,int* pi)
{
    if(root)
    {
         a[(*pi)++]=root->val;
         ProeOrder(root->left,a,pi);
         ProeOrder(root->right,a,pi);
    }
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int* a,i=0;
    *returnSize=BzSize(root);
    a=(int*)malloc(sizeof(int)*(*returnSize));
    ProeOrder(root,a,&i);
    return a;
}

4. 翻转二叉树🏎️

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

4.1 思路分析💷


4.2 代码实现🛠️

 void ChangeNode(struct TreeNode* root)
{
    if(root==NULL)
        return;
    struct TreeNode* tmp=root->left;
    root->left=root->right;
    root->right=tmp;
    //每一个节点都要交换
    ChangeNode(root->left);
    ChangeNode(root->right);
}
struct TreeNode* invertTree(struct TreeNode* root) {
    ChangeNode(root);
    return root;
}

5. 另一颗树的子树🚂

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

5.1 思路分析🛡️


5.2 代码实现🎐

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  isSameTree(p->left, q->left)
                && isSameTree(p->right, q->right);
    else
        return false;
}

bool isSubtree(struct TreeNode* s, struct TreeNode* t){     
    if(s == NULL)
        return false;
    //根相同,判断当前这个树是否和t相同
    if(isSameTree(s, t))
        return true;
    return isSubtree(s->left, t)
            || isSubtree(s->right, t);
}

 6.二叉树的构建及遍历🚃

​​​​​​二叉树遍历_牛客题霸_牛客网

#include <stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
    char* val;
    struct TreeNode* left;
    struct TreeNode* right;
}TNode;
//创建二叉树
TNode* CreateTree(char* str,int* pi)
{
    if(str[*pi]!='#'){
         //当前节点非空,则创建当前节点
         TNode* root=(TNode*)malloc(sizeof(TNode));
         root->val=str[(*pi)++];
         //创建左子树
         root->left=CreateTree(str,pi);
         (*pi)++;
         //创建右子树
         root->right=CreateTree(str,pi);
         return root;
    }
    else {
        return NULL;
    }
}
//中序遍历
void InOrder(TNode* root){
    if(root==NULL)
        return;
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}
int main() {
    char str[101];
    int i=0;
    //读入字符串
    scanf("%s",str);
    //创建二叉树
    TNode* root=CreateTree(str,&i);
    //中序遍历输出
    InOrder(root);
    return 0;
}

7. 对称二叉树🚧

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

7.1 思路分析🧧


7.2 代码实现📆

bool _isSymmetric(struct TreeNode* left,struct TreeNode* right){
    if(left==NULL&&right==NULL)
        return true;
    if(left==NULL||right==NULL)
        return false;
    if(left->val==right->val)
        return _isSymmetric(left->left,right->right)
        &&_isSymmetric(left->right,right->left);
    else
        return false;
}
bool isSymmetric(struct TreeNode* root) {
   return _isSymmetric(root->left,root->right);
}

8. 判断一颗二叉树是否是平衡二叉树🚦

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

8.1 思路分析🎁


8.2 代码实现🛍️

 int TreeHight(struct TreeNode* root){
     return root==NULL?0:
     fmax(TreeHight(root->left),TreeHight(root->right))+1;
 }
 bool _isBalanced(struct TreeNode* root){
     if(root==NULL)
         return true;
     int h1=TreeHight(root->left);
     int h2=TreeHight(root->right);
     if(abs(h1-h2)>1)
         return false;
     return _isBalanced(root->left)&&
     _isBalanced(root->right);
 }
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
        return true;
    return _isBalanced(root);
}

----课后作业🍭

1.二叉树的后序遍历🩸

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.二叉树的中序遍历💎

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 3. 二叉树最大深度🍩

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

3.1 思路分析

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

可以理解就是求高度h


后语🍰

本次我们完成了一些二叉树的oj练习题,我也给大家留了一些课后作业,有需要的小伙伴可以自己点击链接去练习,希望今天的题目让大家对递归有了更好的运用!!!

下一篇博客,我们将一起学习排序的相关知识点!请大家多多期待🙏


本次的分享到这里就结束了!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!期待大家的互动!!!

公主/王子殿下,请给我点赞👍+收藏⭐️+关注➕(这对我真的很重要!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】之Security进阶使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin + All Addons

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin All Addons 简介&#xff1a; Paid Memberships Pro是一款功能强大的会员订阅和内容限制管理插件&#xff0c;适用于WordPress网站。它提供了丰富的特性和工具&#xff0c;帮助网站所有者轻松地创建和管理付费…

基于XML配置方式SSM框架西蒙购物网

文章目录 一、网站功能需求二、网站设计思路1、设计模式2、网站前台3、网站后台4、购物流程图 三、网站运行效果四、网站实现步骤&#xff08;一&#xff09;创建数据库与表1、创建数据库 - simonshop2、创建用户表 - t_user3、创建商品类别表 - t_category4、创建商品表 - t_p…

由于找不到msvcp110.dll无法继续执行此代码详细解析

在使用电脑的过程中&#xff0c;我们偶尔会遇到一些错误提示&#xff0c;其中最常见的就是“缺少xxx.dll文件”。这些文件是动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它们包含了许多程序运行所需的函数和资源。而msvcp110.dll就是其中一个常见的DLL文件。这个错误…

matlab 点云最小二乘拟合空间直线(PCA法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 见:matlab 点云最小二乘拟合空间直线。 二、代码实现 clc;clear; %% ----

LeetCode 1954. 收集足够苹果的最小花园周长

一、题目 1、题目描述 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整数 need…

第11章 GUI Page429~430 步骤八 支持“十字”形

运行效果&#xff1a; 关键代码&#xff1a; 新增头文件&#xff1a; //item_cruciform.hpp #ifndef ITEM_CRUCIFORM_HPP_INCLUDED #define ITEM_CRUCIFORM_HPP_INCLUDED#include <cmath> #include "item_line.hpp"class CruciformItem : public IItem { pub…

多用户商城系统支付模块解决方案 多用户商城系统分账方案

最近很多朋友咨询多用户商城系统的支付模块解决方案&#xff0c;今天我分享两种主流的解决方式。 多用户商城系统是支持商户入驻的电商平台系统&#xff0c;因为涉及多商户入驻&#xff0c;所以有支付、结算方面的系列处理&#xff0c;目前主流的是两种方式。 一个是统一支付&…

Qt Splitter添加实例

选中界面的两个控件右键【布局】》【使用分裂器水平布局】或者【使用分裂器垂直布局】 界面添加横向竖向的splitter&#xff0c;并且添加比例&#xff0c;这类界面需要代码进行干预&#xff1a; 代码&#xff1a;

玩转Spring状态机

说起Spring状态机&#xff0c;大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢&#xff1f;没错&#xff0c;Spring状态机就是状态模式的一种实现&#xff0c;在介绍Spring状态机之前&#xff0c;让我们来看看设计模式中的状态模式。 1. 状态模式 状态模式的定义如…

BIT-6-指针(C语言初阶学习)

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址平时口语中说的指针&#xff0c;通常…

代码随想录算法训练营 | day59 单调栈 503.下一个更大元素Ⅱ,42.接雨水

刷题 503.下一个更大元素Ⅱ 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个…

指标体系构建-04-非交易型数据指标体系

参考&#xff1a; 本文参考 1.接地气的陈老师的数据指标系列 2.saas是什么意思&#xff1f;国内十大saas平台 3.SaaS产品数据分析之指标与标签 举个&#x1f330; &#x1f330;&#x1f330;&#x1f330;&#x1f330;&#x1f330;&#x1f330; 运营类指标体系 运营类指…

向华为学习:IPD运作-PDP产品开发流程-概念阶段的关键活动

如大家所了解的&#xff0c;IPD集成产品开发体系先从需求着手&#xff0c;通过市场管理流程&#xff08;MM&#xff09;保证做正确的事&#xff0c;再通过产品开发流程&#xff08;PDP流程&#xff0c;很多时候直接称作IPD流程&#xff09;保证把事情做正确。整个过程两个流程协…

Jenkins Pipeline脚本优化:为Kubernetes应用部署增加状态检测

引言 在软件部署的世界中&#xff0c;Jenkins已经成为自动化流程的代名词。不断变化的技术环境要求我们持续改进部署流程以满足现代应用部署的需要。在本篇博客中&#xff0c;作为一位资深运维工程师&#xff0c;我将分享如何将Jenkins Pipeline进化至不仅能支持部署应用直至R…

MacOS+Homebrew+iTerm2+oh my zsh+powerlevel10k美化教程

MacOS终端 你是否已厌倦了MacOS终端的大黑屏&#xff1f; 你是否对这种美观的终端抱有兴趣&#xff1f; 那么&#xff0c;接下来我将会教你用最简单的方式来搭建一套自己的终端。 Homebrew的安装 官网地址&#xff1a;Homebrew — The Missing Package Manager for macOS (o…

SpringSecurity安全框架 ——认证与授权

目录 一、简介 1.1 什么是Spring Security 1.2 工作原理 1.3 为什么选择Spring Security 1.4 HttpSecurity 介绍&#x1f31f; 二、用户认证 2.1 导入依赖与配置 2.2 用户对象UserDetails 2.3 业务对象UserDetailsService 2.4 SecurityConfig配置 2.4.1 BCryptPasswo…

pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称及pip安装

问题原因 通常出现这种情况是因为cmd&#xff08;终端&#xff09;无法识别pip指令&#xff0c;环境变量中缺失pip程序路径&#xff0c;因此需要手动将pip所在路径添加到环境变量 确保环境中包含pip 通常情况下&#xff0c;配置的环境中都会默认包含pip&#xff0c;本文采用…

C++设计模式 #6 桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个变化的维度。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff0c;而不引入额外的复杂度 举个栗子 我们…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…