二叉树基础OJ题

简介: 二叉树基础OJ题



一、前言

前面我们学习了树与二叉树的相关知识,了解了它的一些基本的相关操作。那么今天我们就来练习一下二叉树的一些相关的OJ题。

此篇博客仅记录博主自己学习的一些有关二叉树的基础OJ题,分享自己的做题过程和想法,如有错误,还请各位指出,这样能帮助我进步,谢谢。

废话少说,我们直接开始吧。


二、单值二叉树

练习链接:单值二叉树

题目描述:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。如下图:(图一是单值二叉树,图二不是)

思路:遍历这棵树,如果每个结点n都和它的孩子节点相等,那么n的孩子也跟n的父亲相等。那么这个二叉树就是一个单值二叉树。

解题代码:

bool isUnivalTree(struct TreeNode* root)
{
    if(root == NULL)
        return true;
    if(root->left && root->left->val != root->val)
        return false;
    if(root->right && root->right->val != root->val)
        return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

为了方便大家理解,下面我们来看一看代码的递归展开图:(下图只有左子树递归图,右子树思路相同)


三、检查两颗树是否相同

练习链接:相同的树

题目描述:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如下图:

                     

思路:遍历二叉树,根节点都为空,返回true。一个为空,另一个不为空,返回false。如果都不为空,但是值不相等,返回false。然后递归判断p的左子树和q的左子树是否相等,p的右子树和q的右子树是否相等。  

解题代码:

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);
}


四、对称二叉树

练习链接:对称二叉树

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

                                                             

                      true                                                                                              false

思路:两节点都为空返回,即二叉树遍历完毕,返回true;两节点其中一个为空另一个不为空返回false;两节点值不同返回false。

当上面三种情况都不符合时,就进行单层递归:当两节点值相等且有孩子的时候,就需要考虑再次调用函数,来判断一个的左孩子是否与另一个的右孩子相等,一个的右孩子是否与另一个的左孩子相等。

解题代码:

bool _isSymmetric(struct TreeNode* root1, struct TreeNode* root2)
{
    if(root1 == NULL && root2 ==NULL)
        return true;
    if(root1 == NULL || root2 ==NULL)
        return false;
    if(root1->val != root2->val)
        return false;
    return _isSymmetric(root1->left, root2->right) && 
        _isSymmetric(root1->right, root2->left);
}
bool isSymmetric(struct TreeNode* root)
{
    if(root == NULL)
        return true;
    return _isSymmetric(root->left, root->right);
}


五、另一颗树的子树

练习链接:另一棵树的子树

题目描述:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

如下图:第一个是false,第二个是true

                       

思路:每个节点都可以认为是一个子树的根。将原树中所有子树都找出来跟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(isSameTree(root, subRoot))
        return true;
    return isSubtree(root->left, subRoot) ||
    isSubtree(root->right, subRoot);
}


六、判断一棵树是不是平衡二叉树

平衡二叉树

题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

思路:一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树。

对于当前遍历到的节点,首先计算左右子树的深度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。

解题代码:

int BinaryTreeDepth(struct TreeNode* root)
{
    if(root == NULL)
        return 0;
    int leftDepth = BinaryTreeDepth(root->left);
    int rightDepth = BinaryTreeDepth(root->right);
    return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
bool isBalanced(struct TreeNode* root)
{
    if(root == NULL)
        return true;
    return (abs(BinaryTreeDepth(root->left)-BinaryTreeDepth(root->right)) <= 1) 
            && isBalanced(root->right) 
            && isBalanced(root->left);
}


七、结尾

以上就是今天的全部内容了。写完了上面的四个题。又对二叉树的递归思想有更深的理解了呢。

目录
相关文章
|
2天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
6天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
9天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
3天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
303 192
|
3天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
357 167
|
2天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
305 2
|
8天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
458 93