Leetcode 101. 对称二叉树
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
1、题目📑
给你一个二叉树的根节点 root , 检查它是否轴对称。
实例1:
输入:root = [1,2,2,3,4,4,3]
输出:true
实例2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
- 树中节点数目在范围
[1, 1000]内 -100 <= Node.val <= 100
2、思路🧠
方法一:递归
- 特判: 如果头节点
root == null时,返回true - 递归:结束条件
- 如果左右两个节点都为空,则一定是对称的
- 左右节点有一个节点为空,则必然不可能对称
- 前两点如果都不满足,说明存在左右两个孩子节点,则进行左右节点的值比较
- 返回:调用dfs函数进行递归判断。
方法二:辅助队列
该方法实现以方法一思路相同,将左右节点通过队列来辅助存储。
- 特判: 如果头节点
root == null && 头结点的左孩子为空,头结点的右孩子为空时,返回true - 初始化: 将头结点的左孩子、右孩子依次入队。
- 循环遍历:
- 左右节点为空时,跳过此次判断
- 左右节点有一个节点为空,则必然不可能对称
- 前两点如果都不满足,说明存在左右两个孩子节点,则进行左右节点的值比较
- 结束循环,说明以上的所有条件都满足,直接返回true。
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) {
return true;
}
//调用递归函数
return dfs(root.left, root.right);
}
public boolean dfs(TreeNode left, TreeNode right){
//在判断对称,需要考虑以下3种情况
//1、如果左右两个节点都为空,则一定是对称的
//2、左右节点有一个节点为空,则必然不可能对称
//3、前两点如果都不满足,说明存在左右两个孩子节点,则进行左右节点的值比较
//如果前3个条件都不满足,继续往该节点的孩子节点进行递归判断
if(left == null && right == null) return true;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
return dfs(left.left, right.right) && dfs(left.right, right.left);
}
}
时间复杂度:O(N) N 为二叉树的节点数量
空间复杂度:O(N) 这里代表遍历的深度
第二次commit AC
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root != null && root.right == null && root.left == null) return true;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while(!queue.isEmpty()) {
//取出两个节点,再比较这两个节点
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left == null && right == null) continue;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}
时间复杂度:O(N) N 为二叉树的节点数量
空间复杂度:O(N)
4、总结
该题目的对树要了解,并掌握DFS,BFS相关知识。对于树,打牢遍历基础。要像有序数组对二分敏感一样,做到树对递归敏感。在递归判断过程中存在短路现象,在进行 与(&&) 操作时,如果返回值 false 则后面的不再进行计算。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!