对称二叉树

93 阅读1分钟

题目描述

image.png

思路

  • 不管是迭代还是递归,要注意
    • node1的左子树和node2的右子树是否对称
    • node1的右子树和node2的左子树是否对称

迭代法

  • 注意node的添加顺序,是按照
    • node1的左子树
    • node2的右子树
    • node1的右子树
    • node2的左子树
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()) {
            TreeNode tmp1 = queue.removeFirst();
            TreeNode tmp2 = queue.removeFirst();
            if(tmp1 == null && tmp2 == null) {
                continue;
            }
            if(tmp1 == null || tmp2 == null) {
                return false;
            }
            if(tmp1.val != tmp2.val) {
                return false;
            } 
            //注意添加顺序
            queue.addLast(tmp1.left);
            queue.addLast(tmp2.right);
            queue.addLast(tmp1.right);
            queue.addLast(tmp2.left);
        }
        return true;
    }

}

递归法

  • 先考虑两个节点值相等吗?如果相等,那么继续往下一层比较:
    • node1的左子树和node2的右子树是否对称
    • node1的右子树和node2的左子树是否对称
//递归
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return check(root.left, root.right);
    }
    public boolean check(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) {
            return true;
        } 
        //一开始只写了node1.val == node2.val,即如果两个节点相等,那么可继续向下比对。
        //前面一段条件是防止两边不对称,一边出现了null
        if (node1 != null && node2 != null && node1.val == node2.val) {
            return check(node1.left, node2.right) && check(node1.right, node2.left);
        } else {
            return false;
        }
    }
}