提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
递归:构造一个递归函数,传入的参数是两个节点,返回值是该二叉树对称与否。对这两个节点遍历顺序恰好对称,但遇到以下条件立即判定为该树是非对称二叉树:
1、两个节点中仅有一个为空节点;
2、两个节点不相同。
递归返回条件是两个节点都为空。
最后递归遍历相反顺序的子节点。
/**
* 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) {
return recur(root, root);
}
public boolean recur(TreeNode tree1, TreeNode tree2){
if(tree1 == null && tree2 == null){
return true;
}
if(tree1 == null || tree2 == null){
return false;
}
if(tree1.val != tree2.val){
return false;
}
return recur(tree1.left, tree2.right) && recur(tree1.right, tree2.left);
}
}
迭代:构建两个队列,利用队列先进先出的特性,分别以相反的顺序入队从根节点开始的左右子树。判断出队时的节点值是否相等,以及是否仅有一个为空,以此验证是否是对称二叉树。具体如代码所示。
/**
* 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) {
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
queue1.offer(root);
queue2.offer(root);
while(!queue1.isEmpty()){
TreeNode node1 = queue1.poll();
TreeNode node2 = queue2.poll();
if(node1 == null && node2 == null){
continue;
}
if(node1 == null || node2 == null){
return false;
}
if(node1.val != node2.val){
return false;
}
queue1.offer(node1.left);
queue1.offer(node1.right);
queue2.offer(node2.right);
queue2.offer(node2.left);
}
return true;
}
}