【LeetCode】【数据结构】二叉树必刷OJ题

这篇具有很好参考价值的文章主要介绍了【LeetCode】【数据结构】二叉树必刷OJ题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode】【数据结构】二叉树必刷OJ题,LeetCode刷题笔记,数据结构,leetcode,数据结构,算法,c语言

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

【LeetCode】226.翻转二叉树

【LeetCode】100.相同的树

【LeetCode】5.对称二叉树

【LeetCode】9.另一颗树的子树


前言

在学习完二叉树的基本知识后,博主给大家带来了几道经典的二叉树OJ题,快来试试你对于递归的理解到底如何?


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


【LeetCode】226.翻转二叉树

原题链接:🍏226. 翻转二叉树🍏

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

【LeetCode】【数据结构】二叉树必刷OJ题,LeetCode刷题笔记,数据结构,leetcode,数据结构,算法,c语言

 思路:

我们把复杂问题简单化,先考虑交换左右孩子为:

root->left=right;//假设right为右孩子

root->right=left;//假设left为左孩子

如果利用递归的思想,这里right 和 left最好是翻转后的左右子树的根节点。

那么好了,left 和 right的值如何来?

我们就可以有这样的递归过程:

 struct TreeNode* left=invertTree(root->left);
 struct TreeNode* right=invertTree(root->right);

 代码实现:

//方法1
struct TreeNode* invertTree(struct TreeNode* root)
{
    if(root==NULL)
    {
        return NULL;
    }
    struct TreeNode* left=invertTree(root->left);
    struct TreeNode* right=invertTree(root->right);
    root->left=right;
    root->right=left;
    return root;
}

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

【LeetCode】100.相同的树

原题链接:🍏100. 相同的树🍏

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

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

【LeetCode】【数据结构】二叉树必刷OJ题,LeetCode刷题笔记,数据结构,leetcode,数据结构,算法,c语言

 思路:

递归的思想思考

先递推到最基础的子问题:

最基础的单个节点是否相同,那么首先如果两个都为空,证明相同返回true;

如果有一个为空,另外一个不为空则不相同返回false;

如果两个节点的值不相同,则返回false;

最后回归到大问题:

如何证明两个树都相同呢?

我们可以从左子树开始依次判断,如果不同就直接返回false,只要过程中有一个函数返回false,那么会导致程序直接结束并返回false;

如果相同就继续判断右子树,如果左右子树都递推到空指针了,那么返回true。

代码实现:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //到达这里时,证明p、q至少有一个不为空
    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);
}

【LeetCode】5.对称二叉树

原题链接:🍏101. 对称二叉树🍏

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

【LeetCode】【数据结构】二叉树必刷OJ题,LeetCode刷题笔记,数据结构,leetcode,数据结构,算法,c语言

思想:

大体思想其实与相同的子树相似, 只不过这次是一棵树,那么我们可以额外构建一个函数,传递两个指针参数(左右孩子指针),当作相同的子树那里的两棵树,并且比较时我们令两个指针的左孩子与右孩子比即可。

 代码实现:

bool isSymmetricTree(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 isSymmetricTree(p->left,q->right)&&isSymmetricTree(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root)
{
    return isSymmetricTree(root->left,root->right);
}

【LeetCode】9.另一颗树的子树

原题链接:🍏572. 另一棵树的子树🍏

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

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

【LeetCode】【数据结构】二叉树必刷OJ题,LeetCode刷题笔记,数据结构,leetcode,数据结构,算法,c语言

 思路:

根据题目,我们直到subRoot一定不为空,那么我们就需要判断root是否为空的情况,为空直接返回false即可。

什么时候开始进行判断是否为子树呢?

当root->val与subRoot->val相等时,就进入我们是否为子树的判断,这里的判断直接引用我们写的相同的子树即可。

函数返回值为bool值,我们可以采用下面的方式进行判断(逻辑与、逻辑或的结果是真/假)。

return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

 显然中间的逻辑操作符采用 || ,因为左右子树中只要有一个是子树即可,左子树不符合还需要访问右子树,所以采用 || 。

代码实现:

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(root->val==subRoot->val)
    {
        if(isSameTree(root,subRoot))
        {
            return true;
        }
    }

    return isSubtree(root->left,subRoot)
        ||isSubtree(root->right,subRoot);
}

=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

========================================================================= 文章来源地址https://www.toymoban.com/news/detail-720007.html

到了这里,关于【LeetCode】【数据结构】二叉树必刷OJ题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【算法与数据结构】222、LeetCode完全二叉树的节点个数

    【算法与数据结构】222、LeetCode完全二叉树的节点个数

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :利用层序遍历,然后用num++记录节点数量。其他的例如递归法和迭代法也是如此。    层序遍历程序如下 : 复杂度分析: 时间复杂度: O ( n ) O(n) O ( n ) 。 空间复杂度: O ( n )

    2024年02月15日
    浏览(9)
  • 数据结构与算法之二叉树: Leetcode 98. 验证二叉搜索树 (Typescript版)

    验证二叉搜索树 https://leetcode.cn/problems/validate-binary-search-tree/ 描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身

    2024年02月16日
    浏览(11)
  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(17)
  • 二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

    二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

    各位CSDN的uu们你们好呀,今天继续数据结构与算法专栏中的二叉树,下面,让我们进入二叉树的世界吧!!! 二叉树(上)——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链式结构的实现 二叉树链式结构的实现 求二叉树的高度 但是这种写法有很大的问题

    2024年02月17日
    浏览(17)
  • 【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

    【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :首先我们要知道后序遍历数组的最后一个元素必然是根节点,然后根据根节点在中序遍历数组中的位置进行划分,得到根节点的左右子树遍历数组,以此递归。当然这里有一个前提

    2024年02月10日
    浏览(14)
  • 【LeetCode】【数据结构】栈与队列必刷OJ题

    【LeetCode】【数据结构】栈与队列必刷OJ题

    👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】20.有效的括号(栈的括号匹配问题) 【LeetCode】225.用队列实现栈 【LeetCode】232.用栈实现队列 【LeetCo

    2024年02月13日
    浏览(11)
  • 【数据结构-二叉树】二叉树

    【数据结构-二叉树】二叉树

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月07日
    浏览(15)
  • 数据结构:搜索二叉树 | 平衡二叉树

    数据结构:搜索二叉树 | 平衡二叉树

    博客写的代码都放在这里:gitee仓库链接 1.二叉搜索树 1.1.基本概念 二叉搜索树又称二叉排序树, 可以为空,如果不为空具有以下性质的二叉树 : 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的

    2024年01月23日
    浏览(21)
  • 【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

    【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,且为了方便后面的介绍,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研

    2024年01月25日
    浏览(18)
  • 【数据结构】二叉树——链式结构

    【数据结构】二叉树——链式结构

    目录  一、前置声明 二、二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 三、节点个数以及高度 3.1 节点个数 3.2 叶子节点个数 3.3 第k层节点个数 3.4 二叉树的高度/深度 3.5 查找值为x的节点 四、二叉树的创建和销毁 4.1 构建二叉树 4.2 二叉树销毁 4.3 判断二叉树

    2024年02月16日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包