Skip to content
本页目录

0101-对称二叉树

https://leetcode.cn/problems/symmetric-tree 给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树[1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

进阶: 你可以运用递归和迭代两种方法解决这个问题吗?

思路

对称二叉树,分别检查左节点和右节点是不是对称

参考代码

csharp
public class Solution {
    private bool IsSymmetricTree(TreeNode left, TreeNode right){
        //如果有一个节点为null,判断他们是否都为 null
        if(left == null || right == null){
            return left == right;
        }
        //判断值是否相等
        if(left.val != right.val){
            return false;
        }
        return IsSymmetricTree(left.left,right.right) && IsSymmetricTree(left.right,right.left);
    }

    public bool IsSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return IsSymmetricTree(root.left,root.right);
    }
}

参考代码:复习 20220504

要把两个节点拆开判断是否对称

csharp
public class Solution {

    public bool IsSymmetric(TreeNode left, TreeNode right){
        if(left == null || right == null){
            return left == right;
        }
        if(left.val != right.val){
            return false;
        }
        return IsSymmetric(left.left, right.right) && IsSymmetric(left.right, right.left);
    }

    public bool IsSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return IsSymmetric(root.left, root.right);
    }
}

思路:迭代方法

将两个子树分别按照对称方式加入queue

csharp
public class Solution {
    public bool IsSymmetric(TreeNode root) {
        //测试,使用队列把两个子树按照对称方式加入
        if(root == null){
            return true;
        }
        Queue<TreeNode> q1 = new Queue<TreeNode>();
        Queue<TreeNode> q2 = new Queue<TreeNode>();
        q1.Enqueue(root.left);
        q2.Enqueue(root.right);
        while(q1.Count > 0 && q2.Count > 0){ 
            TreeNode node1 = q1.Dequeue();
            TreeNode node2 = q2.Dequeue();
            if(node1 == null || node2 == null){
                if(node1 != node2){
                    return false;
                }
                continue;
            }
            if(node1.val != node2.val){
                return false;
            }
            //对称加入节点
            q1.Enqueue(node1.left);
            q1.Enqueue(node1.right);
            q2.Enqueue(node2.right);
            q2.Enqueue(node2.left);

        }
        return true;
    }
}

Released under the MIT License.