101. 对称二叉树

    xiaoxiao2022-07-13  157

    题目

    给定一个二叉树,检查它是否是镜像对称的。

    例如,二叉树 [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

    说明:

    如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

    递归的思路

    很容易想到:

    如果两个树的根节点都为空,返回true如果两个树A、B的根节点都不为空,并且值相等,等可以递归判断A.left 和 B.right以及A.right 和 B.left否则(两个根节点只有一个为空,或者值不相等)就返回false

    递归代码:

    /** 1. Definition for a binary tree node. 2. public class TreeNode { 3. int val; 4. TreeNode left; 5. TreeNode right; 6. TreeNode(int x) { val = x; } 7. } */ class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; return fun(root.left, root.right); } public boolean fun(TreeNode left, TreeNode right){ if(left == null && right == null) return true; if(left != null && right != null && left.val == right.val ){ return fun(left.left,right.right) && fun(left.right,right.left); } else return false; } }

    迭代的思路

    使用队列,判断两个连续的值是否相同开始存了两次root的值,后来存的就是对称位置的值当判断poll出来的两个都为空时,应该是continue,而不是返回true队列初始化:Queue<TreeNode> queue = new LinkedList<>();,后面的不是queue判断队列是否为空,不是用null,而是isEmpty()

    迭代的代码

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); queue.add(root); while(!queue.isEmpty()){ TreeNode x = queue.poll(); TreeNode y = queue.poll(); if(x == null && y == null) continue; if(x !=null && y != null && x.val == y.val){ queue.add(x.left); queue.add(y.right); queue.add(x.right); queue.add(y.left); } else return false; } return true; } }
    最新回复(0)