【数据结构和算法初阶(c语言)】二叉树系列oj题目图文详解

目录

1.单值二叉树

2.判断两颗二叉树是否相同

3.二叉树的前序遍历

接口了解 

4.判断一棵树是不是另外一棵树的子树

5.判断一棵树是不是对称二叉树

6.二叉树遍历


1.单值二叉树

. - 力扣(LeetCode)

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

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

解题思路:

先判断根和它的左右子树相等不相等,都相等再次判断左右子树和他们的孩子是否相等。(递归的思想)先判断根再判断左右子树属于前序遍历。

题解代码:

bool isUnivalTree(struct TreeNode* root) {

    //如果根为空,这里根据示例1可以返回空

    if(root ==NULL)

    {

        return true;

    }

    //根节点不为空了,现在就来看一下左右孩子的值等不等于根

    if(root->left  &&root->left->val != root->val)

    {

           return false;

    }

     //首先要判断左右孩子有没有,然后再判断两个值是否相等,左子树值与根相等,右子树值与根相等,判定三个节点的值相等。但是如果是判断值相等作为判断条件这里不能直接返回true,返回false是比较好的处理方式

     if(root->right && root->right->val != root->val)

     {

            return false;

     }


 

     //当上述都没有进入说明这一次的根左右子树是相等的,就去下一层

     return isUnivalTree(root->left)&&isUnivalTree(root->right);

     //只要一个返回false就返回false,第一个返回false就不会执行第二个

   

}

我们来看一下例子和代码的递归展开图对比:红色是向下执行,绿色是返回

2.判断两颗二叉树是否相同

. - 力扣(LeetCode)

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

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

 

解题思想:拆分为子问题,根比较,左子树比较,再右子树比较。

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    {
        return true;//如果两个都为空,返回真,这是处理到最后节点的时候,也是从根开始的比较,每一次递归的节点都可以看做是这次比较的根
        
    }
    if(p==NULL||q==NULL)
    {
        return false;//p,q当中至少一个为空的情况,这里就是可以判断一个树有这个节点而另外一棵树没有这个节点的情况,那么这两颗树就是不一样的
    }
    //接下来判定值
    if(p->val!= q->val)
    {
        return false;//判断值相等作为条件会麻烦一些,判断值不等
    }
    //根比较完就开始比较树的左右子树
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);//左右子树返回一个folse整体就为假
}

 

3.二叉树的前序遍历

. - 力扣(LeetCode)

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

我们先看一下这个题目给的接口,补充一些接口了解内容

接口了解 

 

第一:题目要求将打印的结果存在一个数组中,这个数组必须是malloc开辟,但是不需解题的人释放,调用者会去释放。

第二:关于returnsize:这个参数是一个记录数组大小的值,就是说这个函数被调用后我们应该给调用者返回数组的指针,同时也要让调用者能够拿到这个数组的大小方便调用者去遍历这个数组,但是,一个函数是不能够有两个返回值的,所以,这里定义一个int * 类型的指针,外部传入一个变量的地址,通过解引用修改,就可以改变调用者传递过来的这个值,然后调用者可以拿到这个数组的大小。

int Treesize(struct TreeNode* root)
 {
    return root==NULL ? 0: Treesize(root->left)+Treesize(root->right)+1;
 }
 void perorder(struct TreeNode* root,int* a,int* i)
 {
    if(root==NULL)
    {
        return;
    }
    //不为空就将值放入数组里面
    a[(*i)++] = root->val;
    
    perorder(root->left,a,i);//遍历左树,这里传值1注意i已经是指针
    perorder(root->right,a,i);//遍历右树
 }
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    //首先开辟数组方便后面存储
    int n = Treesize(root);
    int* a = (int *)malloc(sizeof(int)*n);
    //这里我们的空间开辟多大,不能盲目指定,开辟大了浪费空间,开辟小了不够,relloc多了会导致内存之间空隙太多,也不是很好,这里我们就根据数的大小来确定所以我们先求一下树的大小。
    //进行前序遍历
    int i =0;
    perorder(root,a,&i);//这里传数组下标使用的是传地址,防止递归过程中有时不会发生下标值的改变造成失误

    *returnSize= n;//返回数组的大小
    return a;//返回a
}

4.判断一棵树是不是另外一棵树的子树

. - 力扣(LeetCode)

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

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

思想:先把根作为一颗树和右边比较看是不是一颗树,因为,相同的树也是子树,不是在和左右子树进行比较 

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    {
        return true;//如果两个都为空,返回真,这是处理到最后节点的时候,也是从根开始的比较,每一次递归的节点都可以看做是这次比较的根
        
    }
    if(p==NULL||q==NULL)
    {
        return false;//p,q当中至少一个为空的情况,这里就是可以判断一个树有这个节点而另外一棵树没有这个节点的情况,那么这两颗树就是不一样的
    }
    //接下来判定值
    if(p->val!= q->val)
    {
        return false;//判断值相等作为条件会麻烦一些,判断值不等
    }
    //根比较完就开始比较树的左右子树
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);//左右子树返回一个folse整体就为假
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL&&subRoot==NULL)
{
    return true;
}  
if(root==NULL||subRoot==NULL)
{
    return false;
}
if(isSameTree(root,subRoot))
{
    return true;
}

// bool ret = isSubtree(root->left,subRoot);
// if(ret)
// {
//     return true;
// }
// ret = isSubtree(root->right,subRoot);
// if(ret)
// {
//     return true;
// }
// return false;
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

}

5.判断一棵树是不是对称二叉树

. - 力扣(LeetCode)

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

解题思想:先看一下根不为空,就判断左右有没有,判断左右值相等与否在判断左子树的左边与右子树的右边,判断左子树的右边和右子树的左边

bool isSymmetricTree(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 isSymmetricTree(p->left,q->right)&&isSymmetricTree(p->right,q->left);
 }
bool isSymmetric(struct TreeNode* root) {
//思想:根和根比较,左子树的左边和右子树的右边进行比较,左子树的右边和右子树的左边进行比较2
if(root == NULL)
{
    return true;
}
//根不等于空就要比较一下左子树和右子树,左子树的左边和右子树的右边是否相等,比较左子树的右边和右子树的左边
//由于后续递归不涉及这棵主树的根,所以单独使用一个递归函数
return isSymmetricTree(root->left,root->right);
    
    
}

 

6.二叉树遍历

解题:

 

#include <stdio.h>
#include<stdlib.h>
typedef int BTDataType;
typedef struct BinaryTreeNode
{
    BTDataType val;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
}BTNode;
 
BTNode* CreatTree(char* str ,int*pi)
{
    if(str[*pi]=='#')
    {
        //如果此时字符为#,这个点就是空,不用申请节点
        (*pi)++;
        return NULL;
 
    }
    //不为空就申请节点
    BTNode* root = (BTNode*)malloc(sizeof(BTNode)*1);
    root->val = str[*pi];
    (*pi++);
    //然后递归连接左右子树
    root->left = CreatTree(str,pi);
    root->right= CreatTree(str,pi);
 
     return root;
 
}
void Inorder(BTNode* root)
{
    if(root==NULL)
    {
        return;
    }
    Inorder(root->left);
    printf("%c ",root->val);
    Inorder(root->right);
 
}
 
int main() {
    //首先创建一个数组来接收字符串
    char str[100];
    scanf("&s",str);
    int i = 0;//数组大小
    BTNode* str2 = CreatTree(str,&i);
    //中序遍历
    Inorder(str2);
    return 0;
}

 

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

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

相关文章

Pillow教程07:调整图片的亮度+对比度+色彩+锐度

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

uniapp流浪动物救助小程序Java宠物领养小程序springboot

uniapp流浪动物救助小程序Java宠物领养小程序springboot 代码40块&#xff0c;需要的私聊 前台基于uniapp小程序 后台管理基于springbootvue前后端分离项目 开发语言&#xff1a;Java 框架&#xff1a;springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xf…

Sentinel源码解析

核心源码都在客户端,服务端只是个Dashboard!!! 在服务端配置好规则后,服务端会把规则推到客户端里去【存在客户端内存里】 服务端记录客户端对外提供的一些接口 客户端引用了依赖并启动后,会定时把自己的信息注册到Sentinel服务端去,并且定时发信息保持心跳 主线 注解…

vue2项目设置浏览器标题title及图标logo

工作中肯定会遇到要修改网页的标题title及图标logo 一、固定设置标题方案 方法一&#xff1a;在vue.config.js文件&#xff0c;添加如下代码&#xff1a; chainWebpack: config > {// 配置网页标题config.plugin(html).tap((args) > {args[0].title 标题return args})…

CV领域 交叉注意力(Cross Attention)中QKV的含义理解

交叉注意力公式&#xff1a; 注意力的输入&#xff1a; &#xff08;1&#xff09;KV&#xff1a;图像的全局特征 &#xff08;2&#xff09;Q&#xff1a;告诉attention需要关注哪些重要特征 公式计算过程理解&#xff1a; &#xff08;1&#xff09;&#xff1a;Q和K相乘…

【C++入门】 初见,单推,与C++的第一次约会

关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒ 引言&#xff1a;本篇博客我们开始与C的第一次约会&#xff0c;C是兼容c的&#xff0c;本篇博客我们将了解到C关键字有哪些&#xff0c;C命名空间&#xff0c;C输入与输出和缺省参数的内容&#xff0c;请放心食用 ~ 文章目录 一 &#x1f3e0; C…

k8s入门到实战(七)—— 回顾:使用yaml文件配置pv、pvc、configmap部署mysql服务

实战&#xff1a;部署 mysql 服务 回顾加深 pv、pvc、configmap 删除所有 deployment、pv、pvc、configmap、StorageClass创建一个 nsf 挂载目录给 mysql mkdir -p /nfs/data/mysql创建 yaml 文件mysql-server.yaml # 创建pv apiVersion: v1 kind: PersistentVolume metadat…

【深度学习】最强算法模型之:潜在狄利克雷分配(LDA)

潜在狄利克雷分配 1、引言2、潜在狄利克雷分配2.1 定义2.2 原理2.3 算法公式2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 给我讲一讲LDA 小鱼&#xff1a;LDA&#xff1f; 你指的是&#xff1f; 小屌丝&#xff1a;就是算法模型的LDA啊&#xff0c; 你…

剑指Offer题目笔记19(二分查找)

面试题68&#xff1a; 问题&#xff1a; ​ 输入一个排序的整形数组nums和一个目标值t&#xff0c;如果数组nums中包含t&#xff0c;则返回在数组中的下标&#xff0c;否则返回按照顺序插入到数组的下标。 解决方案&#xff1a; ​ 使用二分查找。每次二分查找都选取位于数组…

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

[DS]Polar靶场web(一)

静以养心&#xff0c;宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始&#xff0c;后跟任意字符直到 "nb" 的字符串&…

基于Rflysim平台的无人机拦截三维比例导引算法仿真

【后厂村路钢铁侠出品】 一、Rflysim简介 RflySim是一套专为科研和教育打造的Pixhawk /PX4 和MATLAB/Simulink生态系统或工具链&#xff0c;采用基于模型设计&#xff08;Model-Based Design&#xff0c; MBD&#xff09;的思想&#xff0c;可用于无人系统的控制和安全测试。…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

超级会员卡积分收银系统源码:积分+收银+商城三合一小程序 带完整的安装代码包以及搭建教程

信息技术的迅猛发展&#xff0c;移动支付和线上购物已经成为现代人生活的常态。在这样的背景下&#xff0c;商家对于能够整合收银、积分管理和在线商城的综合性系统的需求日益强烈。下面&#xff0c;罗峰给大家分享一款超级会员卡积分收银系统源码&#xff0c;它集积分、收银、…

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变&#xff0c;特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变&#xff0c;提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…

计算机视觉之三维重建(4)---三维重建基础与极几何

文章目录 一、三维重建基础1.1 问题引入1.2 线性解法1.3 非线性解法1.4 多视图几何的关键问题 二、极几何与基础矩阵2.1 极几何2.2 极几何特例2.3 本质矩阵2.4 本质矩阵的性质2.5 基础矩阵2.6 基础矩阵的性质 三、基础矩阵估计 一、三维重建基础 1.1 问题引入 1. 从单张图像恢…

蓝桥杯刷题之路径之谜

题目来源 路径之谜 不愧是国赛的题目 题意 题目中会给你两个数组&#xff0c;我这里是分别用row和col来表示 每走一步&#xff0c;往左边和上边射一箭&#xff0c;走到终点的时候row数组和col数组中的值必须全部等于0这个注意哈&#xff0c;看题目看了半天&#xff0c;因为…

Win11电脑cpu温度过高怎么办呢

Win11电脑cpu温度过高怎么办呢&#xff1f;有时候我们感觉电脑发烫&#xff0c;担心电脑过烫会不会损坏。正常情况下&#xff0c;cpu的温度在45~65度之间&#xff0c;但不排除电脑同时开了太多软件&#xff0c;或者在玩吃鸡、英雄联盟等的大型游戏而导致温度超过85度。只要最高…

excel设置数字下拉递增方法

excel数字下拉递增怎么设置&#xff1f;在我们平常表格的编辑中&#xff0c;不可避免的会需要有这样“1、2、3、4”的序列排序下来&#xff0c;但为了可以更加节省时间提高工作效率&#xff0c;我们可以设置下拉数字递增哦&#xff0c;还在一个一个手动输入的朋友们&#xff0c…

数据结构——线性表(一)

线性表&#xff0c;顾名思义&#xff0c;是具有像线一样的性质的表。如同学生们在操场上排队&#xff0c;一个跟着一个排队&#xff0c;有一个打头&#xff0c;有一个收尾&#xff0c;在其中的学生都知道前一个是谁&#xff0c;后一个是谁&#xff0c;这样就像一根线将他们都串…