剑指 Offer 28. 对称的二叉树

知识点:二叉树;递归

题目描述

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

示例
输入:root = [1,2,2,3,4,4,3]
输出:true 输入:root = [1,2,2,null,3,null,3]
输出:false

解法一:递归法

函数功能:判断树是否对称

1.终止条件:left和right都为null,return true;

2.最小单元节点做什么:判断是否对称呗:如果有一方到null另一方没到 return false; 如果left和right值不等,return false,判断left的left和right的right是否平衡,判断left的right和right的left是否平衡;

3.什么时候做:开始遍历的时候就可以去判断了,放在先序的位置上。

我们如何定义两棵子树 a 和 b 是否 “对称” ?

当且仅当两棵子树符合如下要求时,满足 “对称” 要求:

  • 1.两棵子树根节点值相同;
  • 2.两颗子树的左右子树分别对称,包括:
    • a 树的左子树与 b 树的右子树相应位置的值相等
    • a 树的右子树与 b 树的左子树相应位置的值相等

递归终止条件:

  • 1.两边都走到树头了,而且L.val = R.val = null, return true;
  • 2.有一边走到头了,即有一个节点为空,L.val == null || R.val == null, return false;
  • 3.两个子树的值不相等,下面就不用比了,直接false;L.val != R.val, return false;

其他情况,说明在这一层上已经相等了,我们则要分别检查 L 和 R 的左右节点是否 “对称” ,即递归调用 check(L.left, R.right) 和 check(L.right, R.left)

递归还是抓住两点本质:

  • 递归的终止条件:上面说的那3条;
  • 函数的功能是干什么的,缩小范围:函数就是用来比较两个树是否对称的,往里传树就行了,我能得到结果;从上往下,想要知道整个树是否对称需要知道左右子树是否对称,这是去的过程;知道了左右子树是否对称那就能知道大树是否对称了,这是回的过程。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
else{
return isSymmetric(root.left, root.right);
}
}
private boolean isSymmetric(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 isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
}

时间复杂度;0(N),每个节点恰好被遍历一次;

空间复杂度;O(N),递归过程中栈的开销;

相关链接

对称二叉树

【剑指offer】28. 对称的二叉树的更多相关文章

  1. [剑指 Offer 28. 对称的二叉树]

    剑指 Offer 28. 对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / ...

  2. 【Java】 剑指offer(28) 对称的二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它 ...

  3. 剑指offer——28对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.     题解: 使用正常前序遍历与反向的前序遍历进行比较结果即可,注意,需将空 ...

  4. 剑指Offer:对称的二叉树【28】

    剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* publi ...

  5. Go语言实现:【剑指offer】对称的二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. Go语言实现: 方法一:递归 / ...

  6. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  7. 剑指offer:对称的二叉树

    题目描述: 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 思路分析: 二叉树的镜像就是左右相反,对称二叉树即镜像相等.利用一个递归函数 ...

  8. 剑指Offer 58. 对称的二叉树 (二叉树)

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目地址 https://www.nowcoder.com/practice/ ...

  9. [剑指Offer] 58.对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. [思路]递归,关键是isSame函数中的最后一句 /* struct Tree ...

  10. 【剑指offer】对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 分析:从上到下直接遍历,利用栈或者队列暂存结点,注意结点的存和取都是成对的 c ...

随机推荐

  1. C#将DataTable数据导出CSV文件

    C#将DataTable数据导出CSV文件通用方法! //导出按钮调用导出方法    protected void btnCSV_Click(object sender, EventArgs e)   ...

  2. C语言数组初始化方式

    //一维数组初始化//初始化方法1 int arr[5] = {3,7,2,1,9}; //定义了一个长度是5的数组,并给每个元素赋值 //初始化方法2 int arr[5] = {3,7}; //给 ...

  3. ipconfig提示不是内部或外部命令

    昨天因为公司断网,重新连上之后ip地址变了,于是就想看看现在的ip是什么 输入ipconfig,回车 提示不是外部和内部命令,是因为系统在本路径下未找到ipconfig.exe系统,所以无法识别ipc ...

  4. NOIP模拟测试2「排列 (搜索)·APIO划艇」

    排序 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 输入格式 数据范围与提示 对于30%的数据,1<=N<=4: 对于全部的数据,1<=N< ...

  5. 百炼3752:走迷宫--栈实现dfs

    3752:走迷宫 总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...

  6. Redis的主从数据一致性

    我们学习了 AOF 和 RDB,如果 Redis 发生了宕机,它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性.不过,即使用了这两种方法,也依然存在服 ...

  7. layui 修改表格边框颜色

    /*设置不可编辑时字体颜色*/ .layui-disabled, .layui-disabled:hover { color: #101010 !important; background-color ...

  8. 使用 K6 来给你的服务做一次负载和压力测试吧

    前言 负载测试,压力测试可以衡量服务是否是一个高可用,高性能的服务.负载测试能检验在不同的工作负荷下,服务的硬件消耗和响应,从而得到不同负载情况下的性能指标.压力测试能检验软硬件环境下服务所能承受的最 ...

  9. 【转载】CentOS-Docker安装MongoDB(单点)

    下载镜像 $ docker pull mongo 创建相关目录 $ mkdir -p /usr/mongo/data /usr/mongo/dump 运行镜像 $ docker run --resta ...

  10. 26 bash shell中的信号

    当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM(发送到进程的 TERM 信号用于要求进程终止) 和 SIGQUIT(当用户要求进程执行 core dump 时,QUIT 信 ...