leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历、 对称二叉树等的介绍

文章目录

  • 前言
  • 一、单值二叉树
  • 二、相同的树
  • 三、二叉树的前序遍历
  • 四、二叉树的中序遍历
  • 五、二叉树的后序遍历
  • 六、另一棵树的子树
  • 七、二叉树的遍历
  • 八、 对称二叉树
  • 总结


前言

leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历、 对称二叉树等的介绍


一、单值二叉树

leetcode原题: 单值二叉树

在这里插入图片描述


/**
 * 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 != 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);
}
  • 递归思想:
  • 每个节点都分别与它的左子树根节点和右子树根节点比较。
  • 若传入的节点为NULL,返回 true。(不违反相同的规则)
  • 若左右子树分别不为空并且分别不等于根节点则返回 false。

二、相同的树

leetcode原题:相同的树

在这里插入图片描述


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q== NULL)
    {
        return true;
    }

    if(p == NULL && q != NULL || p != NULL && q == NULL)
    {
        return false;
    }




    if(p->val != q->val)
    {
        return false;
    }

    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
  • 递归思想:
  • 两棵树同时按照根节点,左子树,右子树的顺序比较每个节点。
  • 若两个树根节点都为NULL,则返回true。
  • 若两棵树根节点只有一个为NULL,则返回false。
  • 若两棵树根节点的值不相等,则返回false。

三、二叉树的前序遍历

leetcode原题: 二叉树的前序遍历

  • 其中returnSize是数组元素的个数。传入的是数组元素个数的指针。
  • 要求返回一个数组。

在这里插入图片描述


/**
 * 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 preorder(struct TreeNode* root, int* a, int* pi)
{
    if(root == NULL)
        return;
    
    a[(*pi)++] = root->val;
    preorder(root->left, a, pi);
    preorder(root->right, a, pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);

    int* a = (int*)malloc(*returnSize * sizeof(int));

    int i = 0;
    preorder(root, a, &i);

    return a;
}
  • 思想:
  • 先求出这个树的节点个数,赋值给returnSize。
  • 动态申请returnSize个空间,同时定义下标变量。
  • 在函数preorder中采用前序遍历,将每个节点的值依次赋值给数组。

四、二叉树的中序遍历

leetcode原题: 二叉树的前序遍历

在这里插入图片描述


/**
 * 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 inorder(struct TreeNode* root, int* a, int* pi)
{
    if(root == NULL)
        return;
    
    inorder(root->left, a, pi);
    a[(*pi)++] = root->val;
    inorder(root->right, a, pi);
}


int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);

    int* a = (int*)malloc(*returnSize  * sizeof(int));

    int i = 0;
    inorder(root, a, &i);

    return a;
}

五、二叉树的后序遍历

leetcode原题: 二叉树的中序遍历

在这里插入图片描述

/**
 * 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 postorder(struct TreeNode* root, int* a, int* pi)
{
    if(root == NULL)
        return;
    
    postorder(root->left, a, pi);
    postorder(root->right, a, pi);
    a[(*pi)++] = root->val;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);

    int* a = (int*)malloc(*returnSize * sizeof(int));

    int i = 0;
    postorder(root, a, &i);

    return a;
}

六、另一棵树的子树

leetcode原题: 另一棵树的子树

在这里插入图片描述


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

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);
}
  • 将原二叉树与给定子树进行比较。
  • 若相同返回true。
  • 若不同,原二叉树的左子树和右子树分别与给定子树比较。有一个相同则返回true。

七、二叉树的遍历

牛客网原题: 二叉树的遍历

在这里插入图片描述


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

typedef char BTDataType;
typedef struct BinaryTreeNode
{
    BTDataType val;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
} BTNode;

BTNode* preorder(char* arr, int* pi)
{
    if(arr[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
        

    BTNode* root = (BTNode*)malloc(sizeof(BTNode));

    root->val = arr[(*pi)++];
    root->left = preorder(arr, pi);
    root->right = preorder(arr, pi);

    return root;
}

void Inorder(BTNode* root)
{
    if(root == NULL)
        return;

    Inorder(root->left);
    printf("%c ", root->val);
    Inorder(root->right);
}

int main() {
    char arr[100] = {0};
    scanf("%s", arr);

    int i = 0;
    BTNode* root = preorder(arr, &i);

    Inorder(root);
    return 0;
}

八、 对称二叉树

leetcode原题: 对称二叉树

在这里插入图片描述

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


bool order(struct TreeNode* lret, struct TreeNode* rret)
{
    if(lret == NULL && rret == NULL)
        return true;

    if(lret == NULL || rret == NULL)
        return false;

    if(lret->val != rret->val)
        return false;

    return order(lret->left, rret->right) && order(lret->right, rret->left);
    
}


bool isSymmetric(struct TreeNode* root) {
    if(root == NULL)
        return true;
    
    return order(root->left, root->right);

}
  • 如若传入根节点是空树,则返回true。
  • 若不是空树,比较它的左右子树。
    1. 若左右子树都是空,则返回true。
    1. 若左右子树只有一个是空,则返回false。
  • 然后判断当前两个树节点的val是否相等,若不相等返回false。
  • 若相等继续找子树。

总结

leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历、 对称二叉树等的介绍

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

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

相关文章

STM32项目分享:智能家居语音系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB打板焊接图: 五、程序设计 六、实验效果 七、包含内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com…

删除的照片为什么总是反复出现?6种有效解决方案

在您使用手机时可能会遇到这样的问题&#xff1a;为什么删除了照片后它又回来了&#xff1f;这种奇怪的情况可能会让用户感到不安&#xff0c;并且质疑设备的可靠性。本文将解释导致这种现象的原因&#xff0c;并探讨确保永久删除图像的有效方法。让我们来解决“为什么我的照片…

【软件项目管理篇】怎样平衡软件质量与时间成本范围的关系?

你会发现&#xff0c;在实际的软件项目中不乏这样的例子&#xff1a; 一个项目&#xff0c;正常估算&#xff0c;要三个月才能完成&#xff0c;但是老板或客户要压缩到一个月完成&#xff0c;而你不知道如何说服他们&#xff1b;项目开发一半&#xff0c;产品经理告诉你&#…

智能电销机器人的作用和原理是什么?

要问世界上更火爆的创新技术&#xff0c;人工智能必然要算其一&#xff0c;人工智能正不断的改变着我们的生活&#xff0c;比如智能手机、智能家居、智能门锁等产品已经不断的渗透在了我们的生活之中&#xff0c;而近几年兴起的人工智能语音识别机器人&#xff0c;也迅速俘获了…

【蓝桥杯2025备赛】分巧克力

【蓝桥杯2025备赛】分巧克力 [蓝桥杯 2017 省 AB] 分巧克力 题目描述 儿童节那天有 K K K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N N N 块巧克力&#xff0c;其中第 i i i 块是 H i W i H_i \times W_i Hi​Wi​ 的方格组成的长方形…

GPT、Claude、Perplexity等AI集体宕机罢工,全球打工人崩溃了

就在昨天&#xff01;一个看似平常的周三上午&#xff0c;三大顶尖AI居然集体罢工了&#xff01; 首先&#xff0c;网友们发现OpenAI的ChatGPT崩了&#xff0c;接着Claude和Perplexity也接连陷入崩溃状态。而Gemini也出现了短暂下线问题&#xff0c;整整三个小时&#xff0c;这…

手写节流throttle

节流throttle 应用场景 滚动事件监听scroll&#xff1a;例如监听页面滚动到底部加载更多数据时&#xff0c;使用节流技术减少检查滚动位置的频率&#xff0c;提高性能。鼠标移动事件mousemove&#xff1a;例如实现一个拖拽功能&#xff0c;使用节流技术减少鼠标移动事件的处理…

封装了一个仿照抖音评论轮播效果的iOS轮播视图

效果图 原理 就是我们在一个视图里面有两个子视图&#xff0c;一个是currentView, 一个是willShowView,在一次动画过程中&#xff0c;我们改变current View的frame&#xff0c;同时改变willShowView的frame&#xff0c;同时&#xff0c;需要改变currentVIew 的transform.y不然…

酒店旅游API服务汇总

各大旅游平台常用API服务汇总&#xff1a; 实时房源服务【Airbnb】飞猪旅行开放服务途牛旅行开放平台API华为云数字差旅【差旅管理】动态信息接口【美团酒店】旅行商城商家管理API【马蜂窝】交易流程接口【美团酒店】电子导游【携程旅行】

【Linux】磁盘文件和软硬链接

上篇博客我们说了内存级文件&#xff0c;就是文件加载到内存中它的一些操作。那么不可能所有文件文件都要加载到内存中&#xff0c;大部分文件都要存在与一种可以永久性存储数据的硬件中&#xff0c;就是我们要说的磁盘。现在的笔记本电脑用的都是硬盘&#xff0c;你可以理解为…

12. MySQL 日志

文章目录 【 1. 日志的基本原理 】【 2. 错误日志 Error Log 】2.1 启动和设置错误日志2.2 查看错误日志2.3 删除错误日志 【 3. 二进制日志 Binary Log 】3.1 启动和设置二进制日志3.2 查看二进制日志3.3 删除二进制文件删除所有二进制日志删除小于指定编号的二进制日志删除创…

ICPC2024 邀请赛西安站(7/8/13)

心得 [ICPC2024 Xian I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷 7表示赛时ac了7个&#xff0c;8表示含补题总共ac数&#xff0c;13表示题目总数 题目 M. Chained Lights 打表&#xff0c;发现只有k1是YES //#include <bits/stdc.h> #include<iostream&…

LCTF 2018 bestphp‘s revenge

考点:Soap原生类Session反序列化CRLF注入 <?php highlight_file(__FILE__); $b implode; call_user_func($_GET[f], $_POST); session_start(); if (isset($_GET[name])) { $_SESSION[name] $_GET[name]; } var_dump($_SESSION); $a array(reset($_…

路由黑洞处理

今天BGP基础实验碰到了路由黑洞 BGP承载于IGP之上&#xff0c;BGP路由天生要递归&#xff0c;才能找出口 在E的BGP去A&#xff0c;下一跳只有B&#xff0c;但是流量走了两条路&#xff0c;c和d BGP路由黑洞&#xff1a; 控制层面可达&#xff0c;数据层面不可达; 路由条目在BG…

查看远程桌面端口,查看服务器的远程桌面端口的方法

如果你正在寻找一种方法来检查服务器的远程桌面端口&#xff0c;那么请务必按照以下步骤操作&#xff0c;以确保准确且安全地获取所需信息。这不仅是一个技术问题&#xff0c;更是一个关于效率和安全性的重要议题。 首先&#xff0c;你需要明确&#xff0c;远程桌面端口通常是…

C++之第十一课

课程列表 十分抱歉拖更了这么久&#xff0c;在之前的第十课里也有网友反馈了一个问题&#xff1a; 说的没错&#xff0c;怪我在审稿时没有注意图片&#xff0c;所以这里修正一下&#xff1a; 在此也十分感谢“我有一些感想……”网友的提醒&#xff01; 好了&#xff0c;回到…

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

导航&#xff1a; 本文一些内容需要聚簇索引、非聚簇索引、B树、覆盖索引、索引下推等前置概念&#xff0c;虽然本文有简单回顾&#xff0c;但详细可以参考下文的【MySQL高级篇】 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成…

Linux——内存管理代码分析

虚空间管理 页框和页的关系 页框 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框&#xff0c;也叫页帧&#xff0c;即物理页面&#xff0c;是linux划分内存空间的结果。 每个页框都有一个页框号&#xff0c;即内存块号、物理块号。 页 将用户…

app自动识别ios或安卓手机,微信浏览器,并下载相应的apk安装包

来源是安卓下载界面显示: 来源是IOS下载界面显示: 源码 <!DOCTYPE html> <html lang="en"><head

流水线建构apk、abb实战(二)

gradlew 命令生成apk、aab包 其实构建应用程序包就几个命令&#xff1a; ### 生成AAB&#xff1a; gradlew bundleRelease #输出到[project]/build/outputs/bundle/release/下 gradlew bundleDebug### 生成APK&#xff1a; gradlew assembleRelease gradlew assembleDebug###…