二叉树系列题

OJ104:二叉树的最大深度 

1.题目 

2.注意

这里要用left和right接收递归的结果,如果不接收,直接用递归来比较,会出现效率问题。

3.参考代码

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

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

    int left = maxDepth(root->left) + 1;
    int right = maxDepth(root->right) + 1;

    return left > right ? left : right; 
}

OJ144:二叉树的前序遍历 

1.题目

 2.思路

        该题目要求返回的数组需要malloc,写一个求二叉树节点个数的函数。

preorder(root) 表示当前遍历到 root 节点的答案。按照定义,我们只要首先将 root 节点的值加入答案,然后递归调用 preorder(root->left) 来遍历 root 节点的左子树,最后递归调用 preorder(root->right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。

3.参考代码 

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

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int* arr = malloc(sizeof(int)*(*returnSize));
    int i = 0;
    prevorder(root,arr,&i);
    return arr;
}

OJ965:单值二叉树 

1.题目 

2.思路 :深度优先搜索

一棵树的所有节点都有相同的值,当且仅当对于树上的每一条边的两个端点,它们都有相同的值(这样根据传递性,所有节点都有相同的值)。

因此,我们可以对树进行一次深度优先搜索。当搜索到节点 x 时,我们检查 x 与 x 的每一个子节点之间的边是否满足要求。例如对于左子节点而言,如果其存在并且值与 x 相同,那么我们继续向下搜索该左子节点;如果值与 x 不同,那么我们直接返回 False。

3.参考代码

/**
 * 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)
    {//深度遍历左子树   (!false)——>左子树中存在不同的数
        if(root->val != root->left->val || !isUnivalTree(root->left))
        return false;
    }
    
    if(root->right)
    {//深度遍历右子树
        if(root->val != root->right->val || !isUnivalTree(root->right))
        return false;
    }

    return true;
}

OJ100:相同的树

1.题目

2.思路

深度优先遍历:

如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

3.参考代码: 

/**
 * 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(q == NULL && p == NULL)
        return true;

    //其中一个为空,但另外一个不是空的情况
    if(q == NULL || p == NULL)
        return false;

    if(q->val != p->val)
    {
        return false;
    }
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

OJ101:对称二叉树 

1.题目

2.思路

深度优先遍历

与上一题类似,写一个子函数,分别传根节点的左右孩子。

3.参考代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool _isSymmetric(struct TreeNode*q,struct TreeNode* p)
{
    if(p == NULL && q == NULL)
        return true;
    if(p == NULL || q == NULL)
        return false;
    if(p->val != q->val)
        return false;
    return _isSymmetric(q->left,p->right) && _isSymmetric(q->right,p->left);     
}
bool isSymmetric(struct TreeNode* root) {
  if(root == NULL)
    return true;
    return _isSymmetric(root->left,root->right);
}

OJ572:另一颗树的子树

1.题目

2.思路

深度优先遍历(暴力搜索)

枚举 root 中的每一个节点,判断这个点的子树是否和subRoot 相等。如何判断一个节点的子树是否和 root 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和 subRoot 的根,然后同步移动两根指针来同步遍历这两棵树,判断对应位置是否相等。

3.参考代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
//判断这个点的子树是否和subRoot相等
bool check(struct TreeNode* root, struct TreeNode* subRoot)
{
    if(subRoot == NULL && root == NULL)
        return true;

    if( (root == NULL && subRoot != NULL)|| (root != NULL && subRoot == NULL) ||(root->val != subRoot->val))
    {
        return false;
    }
    return check(root->left,subRoot->left) && check(root->right,subRoot->right);
}
//深度优先遍历(暴力匹配)
bool DFS(struct TreeNode* root, struct TreeNode* subRoot)
{
    if(root == NULL)
        return false;
    //让两个指针一开始先指向该节点和 subRoot 的根,然后同步移动两根指针来同步遍历这两棵树,判断对应位置是否相等。
    return check(root,subRoot) || DFS(root->left,subRoot) || DFS(root->right,subRoot);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    return DFS(root,subRoot);   
}

OJ KY11:二叉树遍历

1.题目

2.思路

上一篇文章中介绍过的通过前序遍历数组构建二叉树方法,注意,在传数组下标时要传指针,因为局部变量出了作用域就会销毁。

3.参考代码

#include <stdio.h>

typedef struct TreeNode
{
    char val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

TreeNode* CreatTree(char* arr, int* pi)
{
    if(arr[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = arr[*pi];
    (*pi)++;
    node->left = CreatTree(arr,pi);
    node->right =CreatTree(arr,pi);
    return node;
}

void InOrder(TreeNode* 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;
    TreeNode* root =  CreatTree(arr,&i);
    InOrder(root);
    return 0;
}

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

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

相关文章

【深入理解计算机系统第3版】补码加法

感觉这部分有点难&#xff0c;所以稍微整理记一下。 抱歉中英混合&#xff0c;来回切换输入法真的很折磨人。 负溢出 正常 正溢出 以4位补码加法为例&#xff0c;理解下表(书中P64) 补码最大值Tmax 2^3 - 1 7, 补码最小值Tmin -2^3 -8 xyz x yz z mod 2^4zU2Tw(z)溢…

[书生·浦语大模型实战营]——Lagent AgentLego 智能体应用搭建实现效果

1.完成 Lagent Web Demo 使用&#xff0c;并在作业中上传截图 使用插件 不使用插件&#xff1a; 2.完成 AgentLego 直接使用部分&#xff0c;并在作业中上传截图 原图 结果 3.完成 AgentLego WebUI 使用&#xff0c;并在作业中上传截图。 4.使用 Lagent 或 AgentLego …

Python数据分析案例46——电力系统异常值监测(自编码器,孤立森林,SVMD)

案例背景 多变量的时间序列的异常值监测一直是方兴未艾的话题&#xff0c;我总能看到不少的同学要做什么时间序列预测&#xff0c;然后做异常值监测&#xff0c;但是很多同学都搞不清楚他们的区别。 这里要简单解释一下&#xff0c;时间序列预测是有监督的模型&#xff0c;而…

使用API有效率地管理Dynadot域名,使用API创建文件夹管理域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

contenteditable实现插入标签的输入框功能(Vue3版)

需求&#xff1a;实现一个简易的函数编辑器 点击参数能够往输入框插入标签点击函数能够往输入框插入文本删除能够把标签整体删除输入的参数能够获取到其携带的信息 插入文本 /*** description 点击函数展示到输入框*/ const getValue ({ item, type }: any) > {// 创建…

计算机网络之crc循环冗余校验、子网划分、rip协议路由转发表、时延计算、香浓定理 奈氏准则、TCP超时重传 RTO

crc循环冗余校验 异或运算 : 相同得0,相异得1 从多项式获取除数 在原数据的末端补0 , 0的个数等于最高次项的阶数 如果最后结果的有效位数较少时&#xff0c;前面应该补0&#xff0c;补到个数与阶位相同 子网划分 子网掩码&#xff1a;用于识别IP地址中的网络号和主机号的…

MySQL数据库整体知识点简述

目录 第一章&#xff1a;数据库系统概述 第二章&#xff1a;信息与数据模型 第3章 关系模型与关系规范化理论 第四章——数据库设计方法 第六-七章——MySQL存储引擎与数据库操作管理 第九章——索引 第10章——视图 第11章——MySQL存储过程与函数 第12章——MySQL 触…

深度解析:ISP代理与住宅代理区别

代理充当用户和互联网之间的中介&#xff0c;提供各种功能以增强安全性、隐私性和可访问性。在众多代理类型中&#xff0c;ISP 和住宅代理脱颖而出&#xff0c;每种代理都具有独特的功能和应用。 了解 ISP 代理 代理ISP&#xff0c;通常称为互联网服务提供商代理&#xff0c;通…

打造高效问答系统:合合信息文档解析工具的应用与实践

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 LLM&#xff08;大型语言模型&#xff09;的应用落地正快速推动着各行各业工作模式的革新。根据埃森哲在2023年发布的研究报告&#xff0c;预计全行业中有40%的工作时间将得到大语言模型的支持与协助。通过引入A…

23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解 一、概念二、适配器模式结构适配器分类核心思想核心角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、概念 适配器模式&#xff08;别名&#xff1a;包装器&#xff09; 是一种结构型设计模式 将一个类的接口转换成客户希望的另…

存内计算与扩散模型:下一代视觉AIGC能力提升的关键

目录 前言 视觉AIGC的ChatGPT4.0时代 扩散模型的算力“饥渴症” 存内计算解救算力“饥渴症” 结语 前言 ​ 在这个AI技术日新月异的时代&#xff0c;我们正见证着前所未有的创新与变革。尤其是在视觉内容生成领域&#xff08;AIGC&#xff0c;Artificial Intelligence Generate…

家政预约小程序12用户登录

目录 1 创建全局变量2 创建页面3 搭建页面4 实现登录逻辑总结 在小程序中&#xff0c;登录是一个常见的场景。比如我们在小程序预约或者购买时&#xff0c;通常要求用户先登录后购买。如果使用传统方案&#xff0c;登录这个动作其实最终的目的是为了获取用户的openid。而使用低…

如何理解与学习数学分析——第一部分——数学分析概观

第1 部分&#xff1a;数学分析概观(Studying Analysis) 1. 数学分析之面目(What is Analysis like?) 本章说明了分析中的定义、定理和证明。 它介绍了一些符号&#xff0c;并解释了如何使用数学分析中的这些数学符号和数学词汇、以及应该把它们读成什么。它指出了这种类型的…

【通俗易懂搞算法】一篇文章弄懂Manacher算法

Manacher算法 manacher算法解决的问题回文 最长回文子串最长回文子串解法解法1.0解法2.0Manacher算法回文半径、回文直径回文半径数组之前扩的所有位置中所到达的最右回文右边界(R)取得更远边界的中心点的位置(C)Manacher算法优化情形Manacher算法优化情形总结 manacher算法代码…

PySpark特征工程(I)--数据预处理

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

工业网关有效解决企业在数据采集、传输和整合方面的痛点问题-天拓四方

一、企业背景概述 随着信息技术的飞速发展&#xff0c;工业互联网已成为推动制造业转型升级的关键力量。在众多工业企业中&#xff0c;某公司凭借其深厚的技术积淀和广阔的市场布局&#xff0c;成为行业内的佼佼者。然而&#xff0c;在数字化转型的道路上&#xff0c;该公司也…

Java中getBytes()方法

我以为旅人将我 热情都燃尽 —— 24.6.4 String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示 而与getBytes相对的&#xff0c;可以通过new String(byte[], decode)的方式来还原这个“深”字时&#xff0c;这个new String(byte[],…

【UML用户指南】-07-对基本结构建模-公共机制

目录 1、术语和概念 1.1、注解&#xff08;note&#xff09; 1.2、修饰 1.3、衍型 1.4、标记值 1.5、约束 1.6、标准元素 1.7、外廓&#xff08;profile&#xff09; 2、对新特性建模 3、对新语义建模 注解 &#xff08;note&#xff09;是附加在元素或元素集上用来表…

EcoVadis审核方法是什么符合EcoVadis规范的文件清单

EcoVadis审核方法是参照全球契约社会责任国际标准进行&#xff0c;包括环境、劳工及人权、商业道德、可持续采购等四大主题又分:能源消耗及温室气体排放、水环境管理、生态环境与物种多样性保护、局部环境污染、原材料及化学品使用(含废弃物)、产品使用、产品生命末期、消费者健…

控制应优先

先从大体上的去找规律&#xff0c;然后才是数字归纳&#xff08;更为详细的&#xff09;&#xff0c;同时控制关系应该优先&#xff08;这里是天数和位置&#xff09;。是否涉及所有对象不是广泛&#xff0c;如果是具体的数值就不是广泛。