1. 题目描述

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

2. 递归

思路:

  1. /**
  2. 1.只要pRoot.left和pRoot.right是否对称即可
  3. 2.左右节点的值相等且对称子树left.left, right.right; left.rigth,right.left也对称
  4. */

代码:

  1. import java.util.*;
  2. public class Solution {
  3. boolean isSymmetrical(TreeNode pRoot){
  4. if(pRoot == null) return true;
  5. return isSymmetrical(pRoot.left, pRoot.right);
  6. }
  7. private boolean isSymmetrical(TreeNode left, TreeNode right) {
  8. if(left == null && right == null) return true;
  9. if(left == null || right == null) return false;
  10. return left.val == right.val //为镜像的条件:左右节点值相等
  11. && isSymmetrical(left.left, right.right) //2.对称的子树也是镜像
  12. && isSymmetrical(left.right, right.left);
  13. }
  14. }

3. 非递归(深度遍历)

思路

  1. /*
  2. * DFS使用stack来保存成对的节点
  3. * 1.出栈的时候也是成对的 ,
  4. 1.若都为空,继续;
  5. 2.一个为空,返回false;
  6. 3.不为空,比较当前值,值不等,返回false;
  7. * 2.确定入栈顺序,每次入栈都是成对成对的,如left.left, right.right ;left.rigth,right.left
  8. */

代码

  1. import java.util.*;
  2. public class Solution {
  3. boolean isSymmetrical(TreeNode pRoot){
  4. return isSymmetricalDFS(pRoot);
  5. }
  6. boolean isSymmetricalDFS(TreeNode pRoot){
  7. if(pRoot == null) return true;
  8. Stack<TreeNode> s = new Stack<>();
  9. s.push(pRoot.left);
  10. s.push(pRoot.right);
  11. while(!s.empty()) {
  12. TreeNode right = s.pop();//成对取出
  13. TreeNode left = s.pop();
  14. if(left == null && right == null) continue;
  15. if(left == null || right == null) return false;
  16. if(left.val != right.val) return false;
  17. //成对插入
  18. s.push(left.left);
  19. s.push(right.right);
  20. s.push(left.right);
  21. s.push(right.left);
  22. }
  23. return true;
  24. }
    }

4. 非递归(广度遍历)

思路:

  1. /*
  2. * BFS使用Queue来保存成对的节点,代码和上面极其相似
  3. * 1.出队的时候也是成对成对的
  4. 1.若都为空,继续;
  5. 2.一个为空,返回false;
  6. 3.不为空,比较当前值,值不等,返回false;
  7. * 2.确定入队顺序,每次入队都是成对成对的,如left.left, right.right ;left.rigth,right.left
  8. */

代码

  1. import java.util.*;
  2. public class Solution {
  3. boolean isSymmetrical(TreeNode pRoot){
  4. return isSymmetricalBFS(pRoot);
  5. }
  6. boolean isSymmetricalBFS(TreeNode pRoot)
  7. {
  8. if(pRoot == null) return true;
  9. Queue<TreeNode> s = new LinkedList<>();
  10. s.offer(pRoot.left);
  11. s.offer(pRoot.right);
  12. while(!s.isEmpty()) {
  13. TreeNode left= s.poll();//成对取出
  14. TreeNode right= s.poll();
  15. if(left == null && right == null) continue;
  16. if(left == null || right == null) return false;
  17. if(left.val != right.val) return false;
  18. //成对插入
  19. s.offer(left.left);
  20. s.offer(right.right);
  21. s.offer(left.right);
  22. s.offer(right.left);
  23. }
  24. return true;
  25. }
    }

剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)的更多相关文章

  1. 剑指Offer——对称的二叉树

    题目描述: 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 分析: 递归解法. 如果对称点一个有一边为空一边不为空,或者是对称点数值不一 ...

  2. python实现剑指offer对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. # -*- coding:utf-8 -*- # class TreeNode ...

  3. 《剑指offer》— JavaScript(5)用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现代码 function Stack(){ var item = []; this. ...

  4. (剑指Offer)面试题7:用两个栈实现队列

    题目: 用两个栈实现一个队列. 队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 根据栈的“先进后出”特点, ...

  5. 剑指offer第二版面试题8:用两个栈实现队列(JAVA版)

    题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 分析: 我们通过一个具体的例子来分析 ...

  6. 剑指offer——已知二叉树的先序和中序排列,重构二叉树

    这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...

  7. 《剑指offer》重建二叉树

    本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...

  8. 剑指 Offer 68 - II. 二叉树的最近公共祖先 + 最近公共祖先(LCA)

    剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Autho ...

  9. 剑指 Offer 68 - II. 二叉树的最近公共祖先

    剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...

  10. 力扣 - 剑指 Offer 55 - I. 二叉树的深度

    题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其 ...

随机推荐

  1. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) C. Messy 构造

    C. Messy You are fed up with your messy room, so you decided to clean it up. Your room is a bracket ...

  2. intellij idea从git检出代码并建立工程

    1. 打开intellij idea,点击configure,settings 2. 左侧展开Version Control,点击Git,点击下图中红框中按钮 3. 在弹出窗口中找到git.exe,点 ...

  3. 1+x证书web前端开发jquery专项练习测试题

    javascript程序设计-题库 1.下面哪一种不属于Jquery的选择器? A. 基本选择器 B. 层次选择器 C. 表单选择器 D. 节点选择器 答案: D 2.如果需要匹配包含文本的元素,用下 ...

  4. 详解JAVA8函数式接口{全}

    1: 函数式接口 1.1 概念 1.2 格式 1.3@FunctionalInterface注解 1.4 调用自定义函数接口 2:函数式编程 2.1:lambda的延迟执行 2.2 使用Lambda作 ...

  5. vue动画实现方式

    vue动画实现方式 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...

  6. Zabbix 预警问题-预警对应的用户报警媒介收不到

    问题背景 公司现在有这种需求,需要我们对关键的预警发送到对应的项目组负责人,比如 保险项目组的服务器预警大于警告的预警发送到保险负责人的邮箱(也会发送给运维的,背锅逃不掉的). 进行创建一个 用户群组 ...

  7. Java入门——初识Java

    Java入门——初识Java 摘要:本文主要对Java这门编程语言进行简单的介绍. Java简介 说明 Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出 ...

  8. Python爬取猪肉价格网并获取Json数据

    场景 猪肉价格网站: http://zhujia.zhuwang.cc/ 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...

  9. java.lang.IllegalArgumentException: java.util.zip.ZipException: invalid LOC header (bad signature)异常解决方法

    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...

  10. 企业账号发布APP

    做了一个公司内部人使用的项目,公司申请了企业开发者账号.现将企业开发者账号发布app的过成总结如下: 1.生成Certificate Signing Request (CSR)文件 2.2 请求Cer ...