欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

对称二叉树

最编程 2024-10-15 07:22:48
...

题目要求

给你一个二叉树的根节点 root , 检查它是否轴对称。

 

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

破题思路

利用递归来确定两个对称的点是不是值相等(包含null的情况),如果是的话,选择当前递归层的节点的下一层对应的对称节点作为参数进入递归。而每一递归层的任务就是判断当前递归层的两个参数节点的值是否相等。

那什么是当前递归层的下一层的对应节点呢?

  • L.left.val = R.right.val :即 L 的 左子节点 和 R 的 右子节点 对称。
  • L.right.val = R.left.val :即 L 的 右子节点 和 R 的 左子节点 对称。

代码实现

带注释的代码实现如下

/**
 * 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) {
        // 从这里开始,假如根节点为空,返回true
        if (root == null) {
            return true;
        }
        // 进入主方法
        return recur(root.left, root.right);
    }

    boolean recur(TreeNode Left, TreeNode Right) {
        //首先判断左右节点是否为空,如果是,则返回真
        //说明当前入参的左右节点对称
        //也说明L,R同时越过叶子结点,此树从顶到底的节点都对称,因此返回true
        if (Left == null && Right == null) {
            return true;
        }

        //当L或者R中只有一个越过叶子节点,另一个没有,则不对称。
        //当L不等于R时,不对称。
        if (Left == null || Right == null || Left.val != Right.val) {
            return false;
        }

        //取当前递归层2个节点的下一层的对称子节点,新起下一递归层
        return recur(Left.left, Right.right) && recur(Left.right, Right.left);
    }
}

手写解析