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

想要精通算法和SQL的成长之路 - 二叉树的判断问题(子树判断 | 对称性 | 一致性判断)

想要精通算法和SQL的成长之路 - 二叉树的判断问题

  • 前言
  • 一. 相同的树
  • 二. 对称二叉树
  • 三. 判断子树

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 相同的树

原题链接
在这里插入图片描述

这题目典型的递归题:

  • 如果两个节点都是null,我们返回true
  • 如果两个节点一个null,一个非空,返回false
  • 最后满足条件:当前两个节点值相等,并且两个节点的左子树相等,右子树也相等。

代码如下:

public boolean isSameTree(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;}if (p == null || q == null) {return false;}return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}

二. 对称二叉树

原题链接
在这里插入图片描述
这个题目,我们依旧使用递归算法。我们可以在第一题的基础上,做一个改变。
一致性代码:

return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);

对称代码:

return p.val == q.val && isSameTree(p.left, q.right) && isSameTree(p.right, q.left);

最终完整代码如下:

public boolean isSymmetric(TreeNode root) {return helper(root.left, root.right);
}public boolean helper(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;}if (p == null || q == null) {return false;}return p.val == q.val && helper(p.left, q.right) && helper(p.right, q.left);
}

三. 判断子树

原题链接
在这里插入图片描述
此题依旧是第一题的一个进阶版,判断B是否是A的子树可以等同于:

  • AB 是否相同?
  • A.leftB 是否相同?
  • A.rightB 是否相同?
  • 以此类推…

那么在第一题的基础上,我们有了函数去判断两棵树是否相等,我们只需要完成上面的判断即可:

public boolean isSubtree(TreeNode root, TreeNode subRoot) {// 特判:root肯定不能为nullif (root == null) {return false;}// 特判:subRoot子树允许为nullif (subRoot == null) {return true;}return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot) || isSameTree(root, subRoot);
}public boolean isSameTree(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;}if (p == null || q == null) {return false;}if (p.val != q.val) {return false;}return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
http://www.lryc.cn/news/181955.html

相关文章:

  • (零)如何做机器视觉项目
  • 【Leetcode】滑动窗口合集
  • 【C++】STL详解(九)—— set、map、multiset、multimap的介绍及使用
  • 计组—— I/O系统
  • 基于vc6+sdk51开发简易文字识别转语音的程序
  • DevOps:自动化部署和持续集成/持续交付(CI/CD)
  • 专业图标制作软件 Image2icon 最新中文 for mac
  • 数据结构:顺序表
  • 僵尸进程的产生与处理
  • TouchEffects - Android View点击特效
  • 从ContinuousEventTimeTrigger/ContinuousProcessingTimeTrigger代码看如何实现一个自定义的触发器
  • Linux 5种网络模型
  • 10.1 调试事件读取寄存器
  • Linux系统常用指令篇---(一)
  • 【初识Linux】:常见指令(1)
  • STM32复习笔记(四):看门狗
  • 【C++进阶(七)】仿函数深度剖析模板进阶讲解
  • 基于SSM的电动车上牌管理系统(有报告)。Javaee项目。
  • mstsc无法保存RDP凭据, 100%生效
  • OpenGLES:绘制一个混色旋转的3D球体
  • Spring AOP 基于注解源码整理
  • C语言 —— 函数栈帧的创建和销毁
  • Appleid苹果账号自动解锁改密(自动解锁二验改密码)
  • Conflicting peer dependency: eslint@8.50.0
  • Vue3 defineProps使用
  • 机器学习7:逻辑回归
  • 生活小记-纸张尺寸
  • 【MATLAB源码-第41期】基于压缩感知算法的OFDM系统信道估计和LS算法对比仿真。
  • 优思学院|六西格玛将烹饪和美味提升至极致
  • git stash