🐕 给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
🐖 思路一:递归解法 递归判断左右子树
当前两个结点是叶子结点
当前如果有一个为空 一个不为空 或者 两个不为空的值不相等 return false
对左子树的 左右子树 、右子树的 左右子树进行递归
上代码
public static boolean isSymmetric(TreeNode root) {
if(root == null) {
return true;
}
// 对左右子树进行递归
return process(root.left,root.right);
}
public static boolean process(TreeNode left , TreeNode right) {
// 当前两个结点是叶子结点
if(left == null && right == null)
return true;
// 当前如果有一个为空 一个不为空 或者 两个不为空的值不相等 return false
if(left == null || right == null || left.val != right.val) {
return false;
}
// 对左子树的 左右子树 右子树的 左右子树进行递归
return process(left.left,right.right) && process(right.left,left.right);
}
🐏 思路二:迭代 使用队列
元素要俩俩进 俩俩出 判断
上代码
public static boolean isSymmetric(TreeNode root) {
if(root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
// 左右子树 同时进队列
queue.add(root.left);
queue.add(root.right);
// 如果队列不为空,就继续
while(!queue.isEmpty()) {
// 每次弹出两个数
TreeNode leftVal = queue.poll(), rightVal = queue.poll();
// 如果都为空 ,则继续循环
if(leftVal == null && rightVal == null) {
continue;
}
// 如果一个空 一个不为空,说明不对称
if(leftVal == null || rightVal == null) {
return false;
}
// 如果两个值不相同 也不是对称的
if(leftVal.val != rightVal.val) {
return false;
}
/*
左子树的左孩子 对应 右子树的右孩子
左子树的右孩子 对应 右子树的左孩子
*/
queue.add(leftVal.left);
queue.add(rightVal.right);
queue.add(leftVal.right);
queue.add(rightVal.left);
}
return true;
}