二叉树的基础oj题(单值二叉树、相同的树、对称二叉树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的构建和遍历、翻转二叉树)

news2024/9/23 13:15:53

今天,我带来二叉树的基础oj题



目录

    • 单值二叉树:[链接](https://leetcode.cn/problems/univalued-binary-tree/)
    • 相同的树:[链接](https://leetcode.cn/problems/same-tree/)
    • 对称二叉树:[链接](https://leetcode.cn/problems/symmetric-tree/)
    • 二叉树的前序遍历:[链接](https://leetcode.cn/problems/binary-tree-preorder-traversal/)
    • 二叉树的中序遍历:[链接](https://leetcode.cn/problems/binary-tree-inorder-traversal/)
    • 二叉树的后序遍历:[链接](https://leetcode.cn/problems/binary-tree-postorder-traversal/)
    • 另一棵树的子树:[链接](https://leetcode.cn/problems/subtree-of-another-tree/)
    • 二叉树的构建和遍历:[链接](https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking)
    • 翻转二叉树:[链接](https://leetcode.cn/problems/invert-binary-tree/)



单值二叉树:链接

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

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

如下图为单值二叉树。
在这里插入图片描述

//依次比较左右结点和根节点
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);
}

在这里插入图片描述



相同的树:链接

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

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
在这里插入图片描述

//比较根节点
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);
}

在这里插入图片描述



对称二叉树:链接

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

在这里插入图片描述

bool _isSymmetric(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 _isSymmetric(root1->left,root2->right) && _isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root)
{
    return !root || _isSymmetric(root->left,root->right);
}

在这里插入图片描述



二叉树的前序遍历:链接

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

在这里插入图片描述

void _preorderTraversal(struct TreeNode* root,int* arr,int* returnSize)
{
    if(root == NULL)
        return;
    
    arr[(*returnSize)++] = root->val;
    _preorderTraversal(root->left,arr,returnSize);
    _preorderTraversal(root->right,arr,returnSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * 101);
    *returnSize = 0;
    _preorderTraversal(root,arr,returnSize);
    return arr;
}

在这里插入图片描述



二叉树的中序遍历:链接

题目要求:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

在这里插入图片描述

void _inorderTraversal(struct TreeNode* root,int* arr,int* returnSize)
{
    if(root == NULL)
        return;
    
    _inorderTraversal(root->left,arr,returnSize);
    arr[(*returnSize)++] = root->val;
    _inorderTraversal(root->right,arr,returnSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * 101);
    *returnSize = 0;
    _inorderTraversal(root,arr,returnSize);
    return arr;
}

在这里插入图片描述



二叉树的后序遍历:链接

题目要求:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

在这里插入图片描述

void _postorderTraversal(struct TreeNode* root,int* arr,int* returnSize)
{
    if(root == NULL)
        return;
    
    _postorderTraversal(root->left,arr,returnSize);
    _postorderTraversal(root->right,arr,returnSize);
    arr[(*returnSize)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * 101);
    *returnSize = 0;
    _postorderTraversal(root,arr,returnSize);
    return arr;
}

在这里插入图片描述



另一棵树的子树:链接

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

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

在这里插入图片描述

bool isSameTree(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 isSameTree(root1->left,root2->left) && isSameTree(root1->right,root2->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);
}

在这里插入图片描述



二叉树的构建和遍历:链接

题目要求:描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。

例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:
输入包括1行字符串,长度不超过100。

输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

在这里插入图片描述

#include <stdio.h>
#include<stdlib.h>

//二叉树的结点定义
typedef char BTDataType;
typedef struct BinaryTree
{
    BTDataType val;
    struct BinaryTree* left;
    struct BinaryTree* right;
}BinaryTree;

//创建二叉树
BinaryTree* RebuildBinaryTree(char* arr,int* pi)
{
    if(arr[(*pi)] == '#')
    {
        (*pi)++;
        return NULL;
    }
    BinaryTree* root = (BinaryTree*)malloc(sizeof(BinaryTree));
    if(root == NULL)
    {
        perror("malloc fail");
        exit(1);
    }
    root->val = arr[(*pi)++];
    root->left = RebuildBinaryTree(arr,pi);
    root->right = RebuildBinaryTree(arr,pi);
    return root;
}

//中序遍历
void InOrder(BinaryTree* root)
{
    if(root == NULL)
        return;
    
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main()
{
    char arr[100];
    scanf("%s",arr);
    int i = 0;
    BinaryTree* root = RebuildBinaryTree(arr,&i);
    InOrder(root);
    return 0;
}

在这里插入图片描述



翻转二叉树:链接

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

在这里插入图片描述

struct TreeNode* invertTree(struct TreeNode* root)
{
    if(root == NULL)
        return NULL;
    
    invertTree(root->left);
    invertTree(root->right);
    struct TreeNode* tmp = root->left;
    root->left = root->right;
    root->right = tmp;
    return root;
}

在这里插入图片描述

今天,二叉树的基础oj题就讲到这里,关注点一点,下期更精彩。

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

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

相关文章

syzkaller 黑盒测试1:环境搭建

syzkaller 黑盒测试1&#xff1a;环境搭建 近期需要使用syzkaller对某Linux发行版系统内核进行测试&#xff0c;但是未提供内核源码&#xff0c;只能在黑盒条件下测试。这是笔者第一次接触syzkaller&#xff0c;对测试流程不太熟悉。另外&#xff0c;网上很少有syzkaller黑盒测…

C语言版扫雷——从0到1实现扫雷小游戏

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚&#xff1b;苦心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…

9_2、Java基本语法之常用类日期、时间类的使用

一、JDK 8之前时间日期API jdk8之前的日期时间类 1.System的currentTimeMillis() 2.java.util.Date以及子类java.sql.Date 3.SimpleDateFormat 4.Calender类&#xff1a;日历类 1、获取系统当前时间&#xff1a;System类下的currentTimeMillis(); //返回的是当前时间与1970年…

MySQL--整合Keepalived进行双机热备自动切换(升级版)

原文网址&#xff1a;MySQL--整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;。 服务器要考虑高可用问题。nginx、tomcat、缓存、队列、数…

Java开发的古董拍卖系统竞标系统拍卖网

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家&#xff0c;发布古董展品&#xff0c;设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间&#xff0c;则不可以竞拍。多人竞拍&#xff0c;买家可以根据最高价设置谁中标&#xff…

系分 - 结构化方法【概念】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - &#xff08;概念&#xff09;结构化方法 结构化方法贯穿整个软件工程全部&#xff0c;可以单独细分出来作为某个软件工程环节的技术指引 结构化方法&#xff0c;由结构化分析&#xff08;SA&#xff0c;St…

【C语言进阶】速学,不会用数据库可不能再错过文本与二进制文件操作

目录 ✨前言✨&#xff1a; &#x1f388;一、文本文件与二进制文件&#x1f388;&#xff1a; &#x1f381;二、文件读取结束的判定&#x1f381;&#xff1a; 1.错误使用 feof 函数&#xff1a; 2.判断文件读取结束&#xff1a; &#x1f38a;三、文件缓冲区&#x1f38…

Ubuntu虚拟机图文安装详细教程

Hello, 小伙伴们&#xff0c;大家好&#xff01;今天教大家一步一步进行ubuntu虚拟机的安装。俗话说的好&#xff1a;“工欲善其事必先利其器”&#xff0c;作为一名嵌入式软件开发人员&#xff0c;我们必须熟悉Linux系统的操作及使用&#xff0c;熟练掌握Linux系统下的开发&am…

java 接口的私有方法

其实java8就已经做下伏笔了 在拥有静态和默认 两种拥有方法体的方法之后 接口出现私有方法也是一种必然 然后我们来创建一个包 包下创建一个接口 subInterface 参考代码如下 public interface subInterface {private void show2() {System.out.println("我是一个私有方…

头条权重在线查询,头条号增加权重的4个妙招

头条号权重可以简单理解为头条号指数&#xff0c;刚开通头条号的时候&#xff0c;会根据头条号的领域、介绍等等给予相应的权重。后期会根据账号使用情况进行调整权重&#xff0c;提高或者降低。 头条权重在线查询方法 打开“站长工具”之后&#xff0c;输入网站网址。…

LeetCodeday04

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3…

JavaScript篇.day08-DOM,节点,事件,定时器,位置及坐标

目录 1.DOM 2.DOM相关操作 (1)获取元素 (2)操作元素 (3)操作元素属性 (4)操作元素类名 (5)操作元素样式 3.节点操作 4.事件 5.事件传播 6.定时器 7.位置及坐标 1.DOM Document Object Model 文档对象模型一整套操作文档流相关内容的属性和方法可以做的操作: 修改样…

前端框架搭建(六)搭建页面框架【vite】

1.安装所需依赖 需要安装 vue-routernaive视图框架 npm npm install vue-router4 yarn yarn add vue-router4npm i -D naive-ui2.搭建naive适配框架 创建文件夹——存放通用组件 在components下创建文件夹common 全局配置常用组件 在之前创建的global.d.ts中添加Window…

枚举的应用

枚举&#xff1a; 在数学和计算机科学理论中&#xff0c;一个集的枚举是列出某些有穷序列集的所有成员的程序&#xff0c;或者是一种特定类型对象的计数。这两种类型经常&#xff08;但不总是&#xff09;重叠。 [1] 是一个被命名的整型常数的集合&#xff0c;枚举在日常生活…

基于CAS操作的atomic原子类型

原子操作 C A S (compare And Swap&#xff09;也叫比较交换&#xff0c;是一种无锁原子算法&#xff0c;映射到操作系统就是一条cmpxchg硬件汇编指令&#xff08;保证原子性)&#xff0c;其作用是让CPU将内存值更新为新值&#xff0c;但是有个条件&#xff0c;内存值必须与期望…

站长权重在线查询,怎么查询网站权重是多少?

什么是网站权重 当站长们辛辛苦苦建立起来一个网站&#xff0c;怎么才能知道自己的网站在搜索引擎中的权重情况呢&#xff1f; 对于很多人而言&#xff0c;权重这个词可能听到最多的场景就是淘宝京东店铺权重。淘宝或京东会根据商家网店的浏览量、好评率、转化率、是否…

4A(统一安全管控平台)解析

4A是指帐号&#xff08;Account&#xff09;、认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和审计&#xff08;Audit&#xff09;&#xff0c;4A统一安全管控平台是以身份为中心&#xff0c;实现帐号、认证、授权和审计统一管控的安…

Spark注意事项

一、Spark理解 数据的操作只有两种 大数据领域中对数据的操作只有两种:聚合 & 处理 无论是多华丽算法,最终都是这两个平平无奇的操作组合而成的 action理解 在spark中,一个action操作为一个jobId(在源码中可以看到runjob 是只有在action操作后才会调用) , 所以一个…

Mac内存空间不足导致无法安装Ventura?可用这些方法释放储存空间

安装Macos新版系统Ventura需要非常多的内存空间&#xff0c;本身我们的Mac磁盘空间就掣襟肘见&#xff0c;我们又该如何释放Mac磁盘空间来安装Ventura呢&#xff1f;今日&#xff0c;小编将分享一些能够释放大量Mac内存空间的方法&#xff0c;以便大家能够优化Mac的运行速度外还…

摄影基础笔记

https://www.icourse163.org/learn/UESTC-1001958013?tid1450439527#/learn/content 这里写目录标题景深 焦距 光圈视角快门测光 感光度构图井字曝光色温白平衡光光的强度光的方向色彩色相明度饱和度色相环反差影调手机瞬间后期处理景深 焦距 光圈 当我们把镜头对着一个景物聚…