二叉树基础oj练习

news2025/1/18 3:32:46

1.单值二叉树

题目:

力扣https://leetcode.cn/problems/univalued-binary-tree/

思路:

单值二叉树 = root和左右孩子的值相等 + 左子树是单值二叉树 + 右子树是单值二叉树

代码:

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

2.相同的树

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/same-tree/submissions/

思路:

相同二叉树 = 比较两棵树的根 + 递归左子树(是否是相同二叉树)+ 递归右子树(是否是相同二叉树)

代码:

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

 题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/symmetric-tree/

思路:

解题方法和上一道题相似

原来的函数接口上是递归不起来的,因此要写一个子函数。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

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

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

  return _isSymmetricTree(root->left,root->right);
}

4.二叉树的前序遍历

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/binary-tree-preorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 前序遍历根,左,右

 代码:

/**
 * 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 _preorderTraversal(struct TreeNode*root,int*a,int*pi)
{
    if(root==NULL)
    return;
    //进行前序遍历根,左,右
    printf("%d ",root->val);
    a[(*pi)++]=root->val;
    _preorderTraversal(root->left,a,pi);
    _preorderTraversal(root->right,a,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    int size=TreeSize(root);
    printf("size:%d\n",size);
    int*a=malloc(sizeof(int)*size);
    int i=0;
    _preorderTraversal(root,a,&i);
    *returnSize=size;
    return a;
}

5. 二叉树中序遍历 

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/binary-tree-inorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 中序遍历左,根,右

代码:

/**
 * 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 _inorderTraversal(struct TreeNode*root,int*a,int*pi)
{
    if(root==NULL)
    return;
    //进行中序遍历左,根,右
    printf("%d ",root->val);
    _inorderTraversal(root->left,a,pi);
     a[(*pi)++]=root->val;
    _inorderTraversal(root->right,a,pi);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
     int size=TreeSize(root);
    printf("size:%d\n",size);
    int*a=malloc(sizeof(int)*size);
    int i=0;
    _inorderTraversal(root,a,&i);
    *returnSize=size;
    return a;
}

 6.二叉树后序遍历 

题目:

力扣icon-default.png?t=MBR7https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 后序遍历左,右,根,

代码:

/**
 * 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 _postorderTraversal(struct TreeNode*root,int*a,int*pi)
{
    if(root==NULL)
    return;
    //进行中序遍历左,根,右
    printf("%d ",root->val);
    _postorderTraversal(root->left,a,pi);
    _postorderTraversal(root->right,a,pi);
     a[(*pi)++]=root->val;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize)
{
    int size=TreeSize(root);
    printf("size:%d\n",size);
    int*a=malloc(sizeof(int)*size);
    int i=0;
    _postorderTraversal(root,a,&i);
    *returnSize=size;
    return a;
}

7.另一颗树的子树

题目:

力扣icon-default.png?t=MBR7https://leetcode-cn.com/problems/subtree-of-another-tree/

思路:

 思路: 相同的树+递归左子树+递归右子树

代码: 

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(isSameTree(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot)
         ||isSubtree(root->right,subRoot);
}

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

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

相关文章

CSS 艺术之心形-彩虹-加载动画

CSS 艺术之心形-彩虹-加载动画(居中抖动问题)参考描述效果HTMLCSS重置元素的部分默认样式bodyli动画定义指定animationul居中抖动问题代码总汇参考 项目描述搜索引擎BingMDNMDN Web Docs 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位) 效果 HTML…

【Vue笔记】Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用

这篇文章,主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。 目录 一、插槽slot介绍 1.1、默认插槽 1.2、具名插槽 (1)如何定义具名插槽??? (2)如何使…

3DMAX纹理插件BerconMaps使用教程

BerconMaps是3dMax的第三方纹理插件。它添加了五个新的3dMax纹理贴图:噪波(Noise)、木纹(Wood)、瓷砖(Tile)、失真(Distortion)和渐变(Gradient)。…

linux配置samba服务

文章目录samba服务第一步:下载samba服务第二步:开启服务,查看服务状态第三步:在文件夹系统查看第四步:设置samba的配置文件第五步:再次去尝试连接linux服务共享修改smab服务的配置设置samba服务的用户名和密…

verilog实现计算器设计

该实验为用verilog编写的一个运算系统,其功能是实现4位整数的加、减、乘、除运算。运算时通过矩阵键盘输入运算类型和运算所需要的数据,然后通过内部电路处理,将计算的结果送于数码管或LCD1602显示。 工程截图如下: 本设计分为两个子模块,按键输入和数码管输出。 还有LC…

python字符串

python字符串 文章目录python字符串一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.字符串创建2.转义字符3.运算符4.格式化5.三引号6.内建函数总结一、实验目的 掌握字符串的用法 二、实验原理 字符串 字符串是一种序列,用于表示和存储文本。py…

Ubuntu16.04安装Chrome出错

安装了Ubuntu16.04之后想要装个Chrome,本来觉得是很简单的事情,下载->安装就结束了,结果没想到搞了好久,最后发现是因为自己偷懒所造成的!因此,写下这篇博文做警示,如果其他人也碰到这样的问…

20230124使AIO-3568J开发板在Android12下横屏

20230124使AIO-3568J开发板在Android12下横屏 2023/1/24 14:05 百度搜索:RK3568 强制横屏 http://www.360doc.com/content/12/0121/07/29321110_1049371522.shtml RK3568 Android-HDMI旋转屏幕显示 硬件开发板:OK3568-C开发板(基于国产瑞芯微…

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

🌱博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛 📜所属专栏:LeetCode每日一题–进击大厂 ✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标 🕵️‍♂️近期目标&#…

恶意代码分析实战 5 分析恶意Windows程序

1 Lab07-01 本次实验分析lab07-01.exe,lab07-02.exe,先来看lab07-01.exe的问题 问题 计算机重启后,这个程序如何确保它继续运行(达到持久化驻留) 首先,查看导入函数。 OpenSCManagerA和CreateServiceA函数暗示着这个恶意代码…

蓝队-HTTP协议的分析

文章目录应用层的协议→HTTP协议访问地址web网站的正确访问姿势请求协议https访问的密钥文件网站的部署通过https协议访问请求报文响应报文请求方法http头协议cookiesRefererUser-AgentX-Forwarded-ForHTTP 状态码HTTP content-type抓包分析HTTP抓包代理插件的下载代理第一种方…

电商项目之同一笔单多次收款成功

1 问题背景 有个收单系统(简称S系统),作用是收单,相当于支付渠道,能够作为第三方服务对接其他支付平台。电商系统(简称A系统)与S系统是隔离的。A系统发起支付请求给S系统,S系统包装一…

Java高效率复习-坦克大战[Java基础合集]

目录 前言 该文章会从零开始制作一个坦克大战的游戏,该游戏使用Java的AWT和Swing作为窗体和容器,使用面向对象、线程等技术来丰富游戏,本文章相等于Java前期和中期技术的一个合集(对于IO、网络、反射并没有涉及到)。 …

高级Spring之Bean 生命周期

老样子,话不多说,直接上代码: 准备容器: SpringBootApplication public class A03 {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03.class, args);context.close(…

【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

前端学习——CSS

文章目录1.CSS1.1什么是CSS1.2快速入门1.3.三种CSS导入方式2.选择器2.1基本选择器2.1.1标签选择器2.1.2类选择器2.1.3id选择器2.2层次选择器2.2.1后代选择器2.2.2子选择器2.2.3相邻兄弟选择器2.2.4通用选择器2.3结构伪类选择器2.4属性选择器3.美化网页元素3.1span标签3.2字体样…

swagger测试Restful API

swagger出现背景 我们构建Restful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端,不同端由不同的团队或者小组负责,为了减少与其他团队平时开发…

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标注意:NI将在NI2020软件版本中删除对cRIO的Pharlap和NI2022软件版本中对PXI的支持。更多信息,请参阅PharLapRTOSEOL路线图。您可能已经拥有一台台式PC,可以作为下一个可靠的确定性测试或控制系统…

初识 Express(基于 NodeJS http 模块封装的 Web 框架)

初识 Express(基于 NodeJS http 模块封装的 Web 框架)参考描述Express获取nodemon获取使用使用创建一个基本的服务器基本路由对客户端的 GET 请求进行响应获取通过 GET 方式提交的 URL 参数静态 URL 参数动态 URL 参数静态资源托管服务器public前缀参考 …

steam搬砖,蓝海信息差副业项目

今天就给大家分享下这个steam搬砖项目的玩法,看完你收藏执行,学不会你可以随便骂我!! 首先我们讲一下项目原理: 我们需要利用国外steam平台来赚取差价,简单点就是在游戏里面搬砖购买一些道具,然…