Leetcode-二叉树oj题

2023-12-04

1.二叉树的前序遍历

144. 二叉树的前序遍历 icon-default.png?t=N7T8 https://leetcode.cn/problems/binary-tree-preorder-traversal/ 这个题目在遍历的基础上还要求返回数组,数组里面按前序存放二叉树节点的值。

既然要返回数组,就必然要malloc一块空间,那么我们需要算出这个二叉树的节点个数,所以就创建一个函数TreeSize求出节点个数。TreeSize的实现在上篇文章有提到 http://t.csdnimg.cn/izhvv >http://t.csdnimg.cn/izhvv

所以在preorderTraversal里面创建一个变量n来接收TreeSize的返回值,再为变量amalloc一块空间,空间大小是n个int。这个时候就要考虑如何存放前序的值,写一个函数PrevOrder,参数是头指针root,数组a,指针变量pi,进入函数首先判断当前节点是否为空,如果是空则返回,不是空则开始存值,将root->val存在a[*pi]这个位置,然后(*pi)++,然后就是递归左右子树。在preorderTraversal内部创建变量i,&i作为PrevOrder参数,再将*returnsize=n,最后返回数组a即可。

int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void PrevOrder(struct TreeNode* root,int* a,int* pi)
{
    if(root==NULL)
        return ;
    a[(*pi)++]=root->val;
    PrevOrder(root->left,a,pi);
    PrevOrder(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    int n=TreeSize(root);
    int* a=(int*)malloc(sizeof(int)*n);
    int i=0;
    PrevOrder(root,a,&i);
    *returnSize=n;
    return a;
}

2.判断两棵树是否相同

100. 相同的树 icon-default.png?t=N7T8 https://leetcode.cn/problems/same-tree/

首先判断这两棵树是否都是空树,如果都是空树则return true,如果没有返回true则说明有以下情况: 1 .p==NULL,q!=NULL. 2 .p!=NULL,q==NULL. 3 .q!=NULL,p!=NULL.下一步就是判断,既然有一棵树为NULL,那么如果另一棵树不为NULL,则返回false,巧妙地利用||逻辑运算符,因为已知走到这一步至少有一棵树不为NULL,所以两个条件至少有一个不成立,||运算符是有一个成立则成立,所以如果另一棵树为NULL则返回false,那么现在只剩下一种情况,两棵树都不为空。这个时候判断当前两棵树的节点的值是否相同即可,如果不相等则返回false。最后递归左右子树,这里需要注意的是,如果左树已经不相同而返回false的话就没必要走右树了,所以使用&&逻辑运算符。

bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    //都为空
    if(p==NULL&&q==NULL)
        return true;
    //其中一个为空
    if(p==NULL||q==NULL)
        return false;
    if(q->val!=p->val)
        return false;
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);

}

3.判断一棵树是否为另一棵树的子树

572. 另一棵树的子树 icon-default.png?t=N7T8 https://leetcode.cn/problems/subtree-of-another-tree/

这里我们可以拷贝上一题的代码,判断是否树相同。首先判断root这棵树是否为空树,如果是空树则返回false。再判断root的值val是否与subRoot的值val相同,如果相同则使用isSameTree判断从当前节点开始两棵树是否相同,如果相同则返回true。最后递归判断一下root的左子树和右子树,这里可以使用||逻辑运算符,因为无论是左边还是右边,有一边中的子树和subRoot相同即可。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    //都为空
    if (p == NULL & q == NULL)
        return true;
    //其中一个为空
    if (p == NULL || q == NULL)
        return false;
    if (q->val != p->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(root->val==subRoot->val)
    {
        if(isSameTree(root,subRoot))
            return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

今天的分享到这里就结束了,感谢大家的阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode-二叉树oj题 的相关文章

随机推荐

  • Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 「JMeter」数据参数化大集合:让你的测试数据更加强大!

    大家好 我是小马哥 每天进步一点点 今天分享的内容是 Jmeter之数据参数化方法汇总 一 什么是参数化 Jmeter参数化是指将脚本中的某些需要输入数据使用参数来代替 在脚本运行时指定参数的取值范围和规则 脚本在运行时就可以根据需要选取不
  • 题解 | #筛选某店铺最有价值用户中消费最多前5名#

    背景 双非本211硕 编程语言 c cuda python方向是算法部署 AI框架 算子开发目标行业 互联网 半导体已oc 深势科技 高性能计算浙 思路 首先join两张表获取所有员工对应的薪水信息 题目为获取每个部门中当前员工薪水最高 拆
  • 集成测试和系统测试的区别是什么?

    前面的文章聊过测试过程效率提升和演变 也分享了我对于单元测试的一些实践和思考 这篇文章接着上篇单元测试的内容 聊聊集成测试的特点 要解决什么问题 以及实践的注意事项 下图是 从需求出现到最后的线上发布 大致要经历的几个阶段 狭义上的测试活动
  • 引爆AI音乐热潮,拓世AI助你创造属于自己的音乐

    使用人工智能创作音乐早已不是什么新鲜事 如果说仅仅几年前 互联网上涌现的那些由AI创作的Kanye West歌曲 听起来仿佛来自科幻小说的奇妙世界 那么如今Al音乐的发展速度已远超人们想象 以至于每当你浏览各大网络平台时 都能看到相关内容
  • 基于java的俄罗斯方块游戏系统设计与实现

    基于java的俄罗斯方块游戏系统设计与实现 I 引言 A 研究背景和动机 基于Java的俄罗斯方块游戏系统设计与实现的研究背景和动机 俄罗斯方块是一种经典的益智游戏 游戏规则简单 但难度较大 需要玩家有良好的计算能力和手眼协调能力 近年来
  • 题解 | #试卷完成数同比2020年的增长率及排名变化#

    import mathn int input count 0 for i in range n 1 s pow i 2 include
  • Airtest进阶使用篇!提高脚本稳定性 + 批量运行脚本!

    一 背景 今天彭于晏为大家分享Airtest进阶使用篇 主要包含两块的内容 提高脚本稳定性 批量运行脚本生成测试报告 二 提高脚本稳定性 1 添加全局配置 全局设置 ST FIND TIMEOUT 10 设置隐式等待时长 默认识别图片时间是
  • 基于java的宠物领养系统设计与实现

    基于java的宠物领养系统设计与实现 I 引言 A 研究背景和动机 基于Java的宠物领养系统设计与实现的研究背景和动机是构建一个方便 安全 可靠 易用的宠物领养平台 以满足领养者 领养机构 宠物领养信息服务平台等多方需求 该平台需要具备以
  • 提升Jmeter测试效率的9种参数化方法!

    jmeter工具无论做接口测试还是性能测试 参数化都是一个必须掌握且非常有用的知识点 参数化的使用场景 1 多个请求都是同一个ip地址 若服务器地址更换了 则脚本需要更改每个请求的ip 2 注册账号 不允许账号重复 想批量注册用户时 3 模
  • Jmeter线程组和同步定时器!

    1 线程组 1 1线程组的定义 进程 正在运作中的程序 QQ 微信 迅雷 线程 进程中的执行单元 一个进程包含多个线程 下载 播放 线程组 按照线程性质对线程进行分组 单个下载 批量下载 接口分组 线程组 就是一个线程组 里面有若干个请求
  • 题解 | #糖糖别胡说,我真的不是签到题目#

    可以提前把施法后的b算出来 因为前面的结果会影响后面的判断 include
  • 需求不明确的情况下,测试该如何处理?

    当需求不明确的情况下 测试团队可以采取以下措施来处理 1 与项目团队进行沟通 测试团队应与项目团队密切合作 与业务分析师 产品经理等相关人员进行沟通 以获取更多的需求细节和背景信息 通过与相关方的交流 可以更好地理解需求的意图和预期 从而更
  • 商城免费搭建之java商城 鸿鹄云商 B2B2C产品概述

    B2B2C平台 以传统电商行业为基石 鸿鹄云商支持 商家入驻 平台自营 多运营模式 积极打造 全新市场 全新 模式 企业级B2B2C电商平台 致力干助力各行 互联网创业腾飞并获取更多的收益 从消费者出发 助力企业构建完整 电商交易生态 整合
  • Leetcode 剑指 Offer II 055. 二叉搜索树迭代器

    题目难度 中等原题链接今天继续更新 Leetcode 的剑指 Offer 专项突击版 系列 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列 include
  • 最全最详细ChatGPT角色预设词教程,Prompt分享

    使用指南 1 可直复制使用 2 可以前往已经添加好Prompt预设的AI系统测试使用 可自定义添加使用 雅思写作考官 我希望你假定自己是雅思写作考官 根据雅思评判标准 按我给你的雅思考题和对应答案给我评分 并且按照雅思写作评分细则给出打分依
  • 题解 | #实现二叉树先序,中序和后序遍历#

    include
  • 乘数而启,向数而行|2023数字金融创新发展论坛成功举办

    订阅制 C端消费者早已耳熟能详 如今也凭借灵活 服务更新稳定的特点 逐渐成为B端企业服务的新热点 比如对中小企业而言 办公IT设备等配套支出都必不可少 但收入 栗栗在线招人啦 哇 各位 招人好难啊 你们赶紧来找栗栗啊 不限经验 不限地域 不
  • AI知识库:智能化的知识管理

    随着人工智能技术的不断发展 越来越多的企业开始关注如何利用AI技术提升业务运营效率 其中 AI知识库作为一种智能化的知识管理工具 已经在各行各业得到了广泛的应用 接下来就探讨一下AI知识库是如何帮助企业实现智能化知识管理的 一 AI知识库的
  • Leetcode-二叉树oj题

    1 二叉树的前序遍历 144 二叉树的前序遍历 https leetcode cn problems binary tree preorder traversal 这个题目在遍历的基础上还要求返回数组 数组里面按前序存放二叉树节点的值 既然