剑指offer_二叉树---对称的二叉树

简介: 剑指offer_二叉树---对称的二叉树

##题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

##解题思路

两种思路

1:构造自己的一颗镜像树,然后比对两颗树是否相同,相同则对称

2:直接让该树左子树的左子树和右子树的右子树交换,左子树的右子树和右子树的左子树交换,如果相同则对称

注意:根节点为null也算对称

##代码

/**
 * 
 */
package 二叉树;
/**
 * 请实现一个函数,用来判断一颗二叉树是不是对称的。 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
 * 
 */
public class IsSymmetrical {
  // 如果相同,则是对称二叉树
  public boolean isSymmetrical(TreeNode pRoot) {
    TreeNode mirrorRoot = getMirror(pRoot);
    return TreeisEqual(pRoot, mirrorRoot);
  }
  // 比较两颗树是否相同
  public boolean TreeisEqual(TreeNode root1, TreeNode root2) {
    if (root1 == null && root2 == null) {
      return true;
    }  
    if (root1 == null || root2 == null) {
      return false;
    }
    if (root1.val != root2.val) {
      return false;
    }
    return TreeisEqual(root1.left, root2.left)
        && TreeisEqual(root1.right, root2.right);
  }
  // 获取该二叉树的镜像树
  public TreeNode getMirror(TreeNode pRoot) {
    if (pRoot == null) {
      return null;
    }
    TreeNode root = new TreeNode(pRoot.val);
    root.right = getMirror(pRoot.left);
    root.left = getMirror(pRoot.right);
    return root;
  }
  // =====================================================================优化算法
  public boolean isSymmetricalSuper(TreeNode pRoot) {
    if (pRoot == null) {
      return true;
    }
    return comRoot(pRoot.left, pRoot.right);
  }
  // 如果左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可
  public boolean comRoot(TreeNode left, TreeNode right) {
    // 如果左右子树都为空,递归结束
    if (left == null && right == null)
      return true;
    // 如果有一个为空,则说明不对称
    if (left == null || right == null)
      return false;
    // 如果都非空,则比较是否相等
    if (left.val != right.val)
      return false;
    return comRoot(left.right, right.left)
        && comRoot(left.left, right.right);
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
  }
}


相关文章
|
缓存 前端开发 测试技术
(译)Python 官方团队在打包项目中踩过的坑
(译)Python 官方团队在打包项目中踩过的坑
247 2
uniapp Vue3 日历 可签到 跳转
uniapp Vue3 日历 可签到 跳转
182 0
|
IDE 测试技术 项目管理
集成开发环境(IDE)的使用:提升Visual Basic开发效率的工具和技巧
【4月更文挑战第27天】本文探讨了如何使用Visual Basic IDE提升开发效率,包括理解IDE组件、利用代码编辑器的智能功能、通过界面设计器设计GUI、使用调试和测试工具、有效管理项目与版本控制、掌握快捷键和宏、定制IDE以及利用学习资源。通过充分利用这些工具和技巧,开发者能更快地编写高质量代码,高效管理项目,从而提升整体开发效率。随着IDE的持续发展,开发者应不断学习新特性以适应进步。
391 1
|
前端开发 JavaScript API
前端界的秘密武器:掌握这些框架,让你轻松秒杀99%的同行!
前端开发日新月异,掌握几个明星框架如React、Vue.js和Angular,不仅能让工作更得心应手,还能轻松超越同行。React以高效的虚拟DOM和组件化著称;Vue.js简洁易懂,灵活性高;Angular提供全面的解决方案,适合大型应用。此外,轻量级的Svelte也值得关注,其编译时处理设计提升了应用性能。掌握这些框架,结合深刻理解和灵活运用,助你在前端领域脱颖而出。
198 9
|
存储 数据可视化 搜索推荐
单细胞分析 | 基因组区域的可视化 (1)
单细胞分析 | 基因组区域的可视化 (1)
单细胞分析 | 基因组区域的可视化 (1)
|
机器学习/深度学习 数据采集 大数据
|
监控 安全 Linux
Docker——基础概念与操作
Docker——基础概念与操作
289 0
|
人工智能 自然语言处理 数据可视化
通义灵码上新功能:用代码画流程图
不想读前人“骨灰级”代码,不想当“牛马”程序员,想像看图片一样快速读复杂代码和架构。通义灵码刚刚支持代码逻辑可视化,可以把你的每段代码画成流程图。像个脑图工具一样帮你图文并茂画出代码逻辑和框架,再也不用迷失在代码迷宫啦!
|
资源调度 JavaScript 定位技术
Vue2使用百度地图展示或搜索地点(vue-baidu-map)
本文介绍了如何在 Vue 项目中使用 `vue-baidu-map` 插件,包括安装、全局注册及具体应用。首先通过 `yarn add vue-baidu-map` 安装插件,并在 `main.js` 中全局注册。然后展示了如何在地图上显示特定位置的标记,以及如何搜索地点并获取其经纬度和详细地址信息。代码示例提供了详细的实现方法和样式调整。如需使用,请确保已获取百度地图 API 的密钥。
2902 1