数据结构初阶--二叉树OJ1

news2024/9/22 15:50:09

目录

  • 二叉树的最大深度
    • 思路分析
    • 代码实现
  • 相同的树
    • 思路分析
    • 代码实现
  • 单值二叉树
    • 思路分析
    • 代码实现
  • 二叉树的前序遍历
    • 思路分析
    • 代码实现
  • 翻转二叉树
    • 思路分析
    • 代码实现
  • 对称二叉树
    • 思路分析
    • 代码实现
  • 另一棵树的子树
    • 思路分析
    • 代码实现

二叉树的最大深度

先来看题目描述

思路分析

题目想让我们求一颗二叉树的最大深度,我们就分别从左子树和右子树往下找,并每次都返回左子树和右子树中的较大值。因为父节点也算一层,所以还要在算出的最大值的基础上再加1.

代码实现

代码如下

int maxDepth(struct TreeNode* root){
    if(root==NULL)
    return 0;
    return fmax(maxDepth(root->left),maxDepth(root->right))+1;

}

相同的树

题目如下

思路分析

大致思路就是左子树和左子树比较,右子树和右子树比较,如果都为空,说明走完了,则返回true。只要两个不相等或一个为空一个不为空(要单独拿出来,防止访问空指针),就返回false。

代码实现

代码如下

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p!=NULL&&q==NULL)
    return false;
    if(p==NULL&&q!=NULL)
    return false;
    if(p==NULL&&q==NULL)
    return true;
    if(p->val!=q->val)
    return false;

    return isSameTree(p->left,q->left)
    &&     isSameTree(p->right,q->right);
}

单值二叉树

题目如下

思路分析

这道题我们惯性思维可能都会先想到左右孩子相比较看是否相等,但这样其与父节点的关系就切断了,我们还要保证其与父节点也相等才对。所以正确思路是每次比较左孩子与父节点,右孩子与父节点是否相等。(注意先判断有没有左右孩子,以防访问空指针)。

代码实现

代码如下

bool isUnivalTree(struct TreeNode* root){
    if(root==NULL)
    return true;


    if(root->left!=NULL&&root->left->val!=root->val)
    {
        return false;
    }
    if(root->right!=NULL&&root->right->val!=root->val)
    {
        return false;
    }
    return isUnivalTree(root->left)
    &&     isUnivalTree(root->right);

}

二叉树的前序遍历

先来看题目描述(注意答案是放在一个数组中的

思路分析

这道题的重点在于我们要有返回值,而返回值就是数组长度,即二叉树的节点个数,难点在于要将节点的值放入一个动态开辟的数组当中去,这里访问数组下标就有别于普通访问了,求节点个数没有什么难度,这里就不细讲了,我们把代码主要分为三个主体:计算大小的函数,开辟数组并返回的主函数和将节点的值放入数组的函数,因为我们要对数组在另一个函数里访问,所以在访问下标是要传下标的地址

代码实现

代码实现如下


int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
    return 0;

    return TreeSize(root->left)+TreeSize(root->right)+1;
}

void _preorder(struct TreeNode* root,int* p,int* pi)
{
    if(root==NULL)
    return NULL;

    p[(*pi)++]=root->val;
    _preorder(root->left,p,pi);
    _preorder(root->right,p,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize=TreeSize(root);
    int* p=(int*)malloc(sizeof(int)*(*returnSize));
    
    int i=0;
    _preorder(root,p,&i);
    return p;
}

翻转二叉树

先来看题目描述

思路分析


大致思路就是先交换左右孩子,然后递归左子树,然后右子树,这样就能实现翻转二叉树了,图解如上。

代码实现

代码实现如下

struct TreeNode* invertTree(struct TreeNode* root){
    if(root==NULL)
    return NULL;

    struct TreeNode* temp=root->left;
    root->left=root->right;
    root->right=temp;

    invertTree(root->left);
    invertTree(root->right);
    return root;

}

对称二叉树

先来看题目描述

思路分析

因为我们要探究的是是否为轴对称,所以我们首先第一步要将其分成左右两个子树,后续的递归操作我们再在另一个函数中去实现,注意比较对象是左子树的左孩子,右子树的右孩子还有判断条件。

代码实现

代码实现如下

 bool _isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot)
 {
     if(leftroot==NULL&&rightroot==NULL)
     return true;
     if(leftroot==NULL&&rightroot!=NULL)
     return false;
     if(leftroot!=NULL&&rightroot==NULL)
     return false;
     if(leftroot->val!=rightroot->val)
     return false;

     return _isSymmetric(leftroot->left,rightroot->right)
     &&     _isSymmetric(leftroot->right,rightroot->left);


 }
bool isSymmetric(struct TreeNode* root){
    if(root==NULL)
    return true;

    struct TreeNode* leftroot=root->left;
    struct TreeNode* rightroot=root->right;
    return _isSymmetric(leftroot,rightroot);

}

另一棵树的子树

题目描述如下

思路分析

这道题的主体思路是遍历root的所有节点,并每次与subroot进行匹配,这个操作在另一个函数中实现,逐个比较subroot和当前作为根节点的root.除了要注意比较函数中的中止递归的条件,还要注意主函数中,如果root为空了,说明遍历完了还没有找到匹配的子树,则返回false。

代码实现

代码如下

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

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL){
        return false;
    }
    return compare(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

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

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

相关文章

QT学习—串口LED小项目

前言——博主刚开始接触QT,本文参考博主嵌入式大杂烩的一篇博文易懂 | 手把手教你编写你的第一个上位机,初步学习一下QT开发。 文章目录 一、QT安装二、新建工程三、创建上位机界面3.1 修改控件名3.2 添加槽函数 四、上位机程序打包五、上位机测试六、总…

不要用 in + 子查询

前两天我的 VIP 用户向我抛出了一个 SQL 问题,他的 MySQL 是 8.x版本: 大概意思如下 sql : select * from A where id in (select max(id) as id from A where task_id in(1,2,3) group by task_id );这个 A 表中是有 task_id 这个索引的。 …

【转换】编码转换工具笔记

应用场景 应用场景是程序整合第三方库多平台运行,第三方库window平台编译,代码移植到linux出现bom问题 思考解决 windows使用utf-8编码,linux使用utf-8无bom编码 工具主要针对utf-8编码文件,能够批量添加删除BOM,无…

SpringBoot获取项目日志

目的 对于布署在远端的服务,我们想快速的获取到日志。对于使用了日志服务,也可能因为上报间隔太长,日志不够实时。 所以想通过一些方式,可以不用进入到容器内也可以简单快速获取到日志,而且是实时的日志。目标就是获…

c语言进阶-动态内存管理

重点学习内容 动态内存管理四大函数 Malloc 内存申请函数 返回值是无类型的指针,指向分配的内存的首地址。申请失败会返回空指针。 malloc返回值是void*类型,使用时需要强制转换成所需类型。 malloc和free匹配使用,但是如果不free释放内存&…

解析3D视觉系统在引导金属件上下料中的应用

原创 | 文 BFT机器人 引言 Introduction 机器视觉技术作为一种高科技的智能化技术,正在工业生产领域发挥着越来越重要的作用。它利用计算机视觉技术,通过获取、处理和分析图像,实现对产品和工艺过程的监测、检测和控制。 随着人工智能技术的…

[SUCTF2019]hardcpp

前言 又遇到ollvm了 解混淆 可以直接用angr运行脚本去除除控制流平坦化,最好在ancoda等管理环境里面安装angr不然问题很多 https://github.com/Pure-T/deflat 去除前 去除后,它将多余的直接nop了 分析 主要加密区域位于匿名函数这一块&#xff0c…

前端学习——Web API(Day1)

Web API基本认知 Web API 基本认知 作用和分类 DOM DOM树 DOM对象 获取DOM对象 根据CSS选择器来获取DOM元素 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" …

【教学类-36-08】转学“纪念册“留念(生肖用midjounery-niji)

作品样式 背景需求&#xff1a; 即将离开班级&#xff0c;我想收集一份28个孩子的绘画册做——留念转学纪念册. 材料准备&#xff1a; 幼儿照片 ——3月初到中6班拍摄的幼儿手持学号名字纸的照片&#xff08;为了背诵幼儿信息而拍摄的照片&#xff0c;统一竖版&#xff09; 生…

jmeter 连接数据库常见报错

1. 不允许主机连接到MySQL 报错信息&#xff1a; Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (null, message from server: "Host 192.168.1.6 is not allowed to connect to this MySQL server") 说明&#xff1a;本机的地…

代码随想录day10

232. 用栈实现队列 思路&#xff1a;用两个list去模拟栈的操作&#xff0c;一个入栈list&#xff0c;一个出栈list. 并且了解栈的操作&#xff0c;pop,peek,push. 代码&#xff1a; def __init__(self):self.stack1 [] #入栈self.stack2[] #出栈def push(self, x: int) ->…

【Linux】常用网络命令:ping\netstat\mount\ifconfig

ping命令用于检测主机&#xff0c;执行ping命令指令会使用ICMP传输协议&#xff0c;发出请求回应的信息&#xff0c;若远程主机的网络功能没有问题&#xff0c;就会回应该信息。   netstat命令用于显示网络状态&#xff0c;利用netstat 指令可让你得知linux系统的网络情况。…

图像 跟踪 - MOTR: End-to-End Multiple-Object Tracking with Transformer (ECCV 2022)

MOTR: End-to-End Multiple-Object Tracking with Transformer - 使用Transformer进行端到端多目标跟踪&#xff08;ECCV 2022&#xff09; 摘要1. 引言2. 相关工作3. 方法3.1 目标检测中的查询3.2 检测查询和跟踪查询3.3 Tracklet-Aware标签分配3.4 MOTR架构3.5 查询交互模块3…

git-创建文件夹方式管理分支

文章目录 前言一、效果图二、git命令总结 前言 下面介绍一个git创建文件夹的方式管理分支的方法&#xff0c;在sourcetree上显示目录样式&#xff0c;好对每个版本做管理&#xff0c;可以更方便追踪历史版本代码。 一、效果图 1、git文件夹方式管理分支 二、git命令 1、在本…

SSMP整合案例(14) 将界面查询改为分页查询

前面几篇文章过后 我们的项目基本环境就算搭好了 但是 我们下面的分页显然就是个摆设 这里 我们就先将查询的方法改成分页的 我们 java项目之前做了这个分页的函数 那么 我们vue项目 直接在 src下的 api 下的bookApi.js中加上对应的函数 export function getPage(params){r…

动态SLAM论文(8) — DynaSLAM II: Tightly-Coupled Multi-Object Tracking and SLAM

目录 1 Introduction 2 Related Work 3 Method A. 符号表示 B. 物体数据关联 C. 以对象为中心的表示 D. 对象束调整 E. 边界框 4 Experiments A. 视觉里程计 B. 多目标跟踪 C. 时间分析 5 结论和未来工作 摘要 —— 在视觉SLAM算法中&#xff0c;假设场景是刚性的是…

快速入门uniapp——从环境搭建到项目实践

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;快速入门uniapp——从环境搭建到项目实践 文章目录 初步介绍UniApp开发环境搭建下载和安装UniApp开发工具创建新项目&#xff08;HBuilderX&#xff09;开发工具界面介绍 UniApp基础知识页面结构页面…

Rdkit|SMARTS语言应用

github&#xff1a;地址 文章目录 Rdkit|SMARTS语言应用子结构搜索HasSubstructMatch(patt)得到子结构序列GetSubstructMatch删除子结构AllChem.DeleteSubstructs(m,patt)取代基替换AllChem.ReplaceSubstructs(m, patt, rep)显示核心结构显示侧链结构 Chem.ReplaceCore分子拆分…

vue transition标签用法

transition标签 是Vue的内置动画标签&#xff0c;在插入/更新/移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名&#xff08;配合css样式使用&#xff0c;实现动画效果&#xff09; 注意&#xff1a; 1.transition标签只能包含一个元素&#xff1b;如果里面写了多个…

如何从零开始学习自动化测试?终于找到靠谱的教程了

目录 前言 测试基础 Python基础 selenium appium requests unittest 项目实战&#xff1a; 总结&#xff1a; 前言 最近有几个小伙伴在后台给安静私信说&#xff0c;如何学习自动化&#xff0c;不知道如何入手&#xff1f;在网上看的资料都是乱七八糟的&#xff0c;每…