力扣101.对称二叉树(java)

题目来源

101. 对称二叉树 - 力扣(LeetCode)

代码1(递归)

java 复制代码
/**
 * 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 isMirror(root.left,root.right);
    }
    //判断两是否对称
    private boolean isMirror(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 isMirror(left.left,right.right) && isMirror(left.right,right.left);
    }
}

代码分析

两子树是否对称最小规模子问题就是:

  1. 左子树 与 右子树是否堆成

(对称:左子树与右子树是否都为空,两值是否都为空, 不对称:只有一值为空)

  1. 左子树的左子树与 右子树的右子树 是否同时与 左子树的右子树与 右子树的左子树 均为对称

代码2(dfs迭代法)

java 复制代码
/**
 * 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;

        Stack<TreeNode> stack = new Stack<>();
        stack.push(root.right);
        stack.push(root.left);

        while(!stack.isEmpty()) {
            TreeNode node1 = stack.pop(); //左子树根结点
            TreeNode node2 = stack.pop(); //右

            if(node1==null && node2==null) continue;
            if(node1==null || node2==null || node1.val!=node2.val) return false;
            // if(node1==null || node2==null) return false;
            // if( node1.val!=node2.val) return false;
            //将......逆向入栈 : 左左与右右  左右与右左
            // 入栈就是为了 看两子树是否对称
            stack.push(node2.left);
            stack.push(node1.right);
            stack.push(node2.right);
            stack.push(node1.left);
        }
        return true;
    }
}

代码分析

这里的dfs,是双向深入的dfs。因为需要两子树进行比较。

代码3(bfs迭代法)

java 复制代码
/**
 * 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;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root.left);
        queue.offer(root.right);

        while(!queue.isEmpty()) {
            TreeNode node1 = queue.poll();
            TreeNode node2 = queue.poll();

            if(node1==null && node2==null) continue;
            if(node1==null || node2==null || node1.val!=node2.val) return false;

            queue.offer(node1.left);
            queue.offer(node2.right);
            queue.offer(node1.right);
            queue.offer(node2.left);
        }
        return true;
    }
}

代码分析

类似dfs,只是逐层处理。

相关推荐
草履虫建模9 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq11 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq12 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq12 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)13 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi13 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱14 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头14 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头14 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱16 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法