当前位置: 首页 > article >正文

数据结构 二叉树 力扣例题AC——代码以及思路记录

LCR 175. 计算二叉树的深

某公司架构以二叉树形式记录,请返回该公司的层级数。

AC

int calculateDepth(struct TreeNode* root) {
    if (root == NULL)
	{
		return 0;
	}
	else
	{
		return 1 + fmax(calculateDepth(root->left), calculateDepth(root->right));
	}
}

代码思路

我这里直接使用的函数,在C语言中没有max函数,只有fmax函数,在头文件<math.h>中,C++中有max函数。

使用递归,当前节点是空就返回0,告诉上一层你已经是最后一层了,上一层就可以返回1,接着就开始逐次向上传递,传递的过程中,要看传递上来的值哪边更大,因为深度是看最大的一条路径,只需要传递最大的就可以,所以直接用函数比较出来然后传递就可以。

965. 单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。

AC

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

代码思路

遍历一遍所有节点,但是在遍历的过程中,进行当前节点和他的左子树与右子树结点的值的比较,前提是有左子树结点和右子树结点,如果说,有左子树也有右子树结点,就需要继续向下检查,如果值不同就返回false,遍历到最底下为空返回true开始返回,返回的时候用逻辑与,这样只要有一个false最后就不是单值,反之是单值。

101. 对称二叉树

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

AC

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) {
    return _isSymmetric(root->left, root->right);
}

代码思路

检查是否对称,那就是检查子树的左子树和右子树是否对称,原函数传入root没办法递归,所以创建子函数传进去左右子树进行检查。检查对称首先检查当前节点是否相同,再检查,左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树是否相同,整体思路和检查是否是同一棵树相同,分为三种if,1.当前两颗子树均为空 2.其中一颗为空 3.都不为空但是值不同,这三种都不符合说明当前两个节点相同且还有子树,仍可以向下递归,调用递归函数。这道题要注意判断的时候,他是镜像的,是左右子树对称。

100. 相同的树

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

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

AC

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

代码思路

整体逻辑:先比较根,不相等就返回false,相等就检查左子树和右子树

比较根的情况:都为空,则返回true;其中一个为空,左或右肯定还有子树,那肯定不一样,返回false;都不为空,但是不相等,返回false。如果以上都不是,那说明该节点相等且有子树,那就接着去检查他的子树,执行递归语句。

572. 另一棵树的子树

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

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

AC

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

代码思路

判断子树里是否包含另一棵树,本质还是检查两棵树是否相同,但是需要找到相同树部分的根节点,也就是要先遍历子树节点,找到与subroot->val相同的值,找不到的话就直接返回false,找到后检查是否相同,相同则返回true。但是这里要思考一个情况,当前根节点的值相同,子树不相同,但是子树与subroot根节点相同,如图,当遍历到第一个4的时候,442与412不同,这时候不能直接返回false,因为他的左子树412与subroot相同,因此需要继续向下遍历并检测是否相同,因此在判断root的值是否相同后再以判断是否相同为条件,不相同继续向下遍历,直到检测到NULL。


http://www.kler.cn/a/273187.html

相关文章:

  • 使用正则表达式验证积累
  • 【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师
  • 非线性数据结构之图
  • 批量修改图片大小+删除空白页+手写签名
  • ubuntu20.04 加固方案-设置SSH是否使用业界认可的加密算法
  • MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题
  • 由浅到深认识C语言(13):共用体
  • 分享一个不错的three.js开源项目
  • 鸿蒙 Harmony 初体验
  • Linux——动静态库的制作及使用与动态库原理
  • hadoop分布式环境搭建
  • 【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频
  • 【华为OD机试】找座位【C卷|100分】
  • 代码随想录阅读笔记-哈希表【四数之和】
  • http协议的历史与基本概念
  • 第四百一十回
  • 【现代C++】移动语义和右值引用
  • JAVA八股文面经问题整理第6弹
  • 【C++】三大特性之多态
  • 苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)
  • VPTTA:为每张医疗图像生成特定的“提示”,解决跨不同设备和条件的医疗图像分割的准确性和适应性
  • 区间问题【前缀和】
  • PHP<=7.4.21 Development Server源码泄露漏洞 例题
  • 【JAVA】Servlet开发
  • HTML选择文件的实时预览
  • Netty中的核心概念