给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
思路:
定义两个指针(左右),一开始都在root节点,随后左指针左移时右指针右移,或者左指针右移时右指针左移,每次检查两者value是否相等以及他们的左右子树是否一致
注意点1:
&& 表示 两者全为true,才是true
|| 表示两者有一个true,就是true
先比较二者是否全为空,如果全为空,就是 true
剩下的情况只有两者不是全为空(1空1非空,2非空),因此如果 treeNode1 == null || treeNode2 == null 为 true,说明当前比较的两点为 1空1非空 或者 2非空,此时都不满足相等
注意点2:
注意最后一行
return treeNode1.val == treeNode2.val && order(treeNode1.left, treeNode2.right) && order(treeNode1.right, treeNode2.left)
假设二叉树样子为(编号1,2,3,4,5,6,7):
1
/ \
2 2
/ \ / \
3 4 4 3
先执行 1.val == 1.val && order(2 == 3),执行到 order(2 == 3),再次递归
为了得出order(2 == 3)的结果,执行order(2 == 3),判断两个 if(null) ,return 2.val == 3.val && order(4 == 7) && order(5 == 6)
为了得出 return 2.val == 3.val && order(4 == 7) && order(5 == 6)的结果,执行 order(4 == 7) 和 order(5 == 6)
为了得出 order(4 == 7) 和 order(5 == 6) 的结果,执行 order(4 == 7) 和 order(5 == 6) ,得出 true
因此 上一个return 的结果为 return 2.val == 3.val && true
因此 再上一个return 的结果为 return 1.val == 1.val && true
最后结果为 true
/**
* 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 order(root, root);
}
public boolean order(TreeNode treeNode1, TreeNode treeNode2){
if (treeNode1 == null && treeNode2 == null){
return true;
}
if (treeNode1 == null || treeNode2 == null){
return false;
}
return treeNode1.val == treeNode2.val && order(treeNode1.left, treeNode2.right) && order(treeNode1.right, treeNode2.left);
}
}