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

2024-03-01 1891阅读

温馨提示:这篇文章已超过425天没有更新,请注意相关的内容是否还可用!

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

👀樊梓慕:个人主页

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

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


目录

前言

【LeetCode】226.翻转二叉树

【LeetCode】100.相同的树

【LeetCode】5.对称二叉树

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


前言

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


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

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

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

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


【LeetCode】226.翻转二叉树

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

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

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

 思路:

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

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题

 思路:

以递归的思想思考

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

最基础的单个节点是否相同,那么首先如果两个都为空,证明相同返回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题

思想:

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

 代码实现:

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题

 思路:

根据题目,我们直到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);
}

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

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

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

🌟~ 点赞收藏+关注 ~🌟

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]