题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/submissions/
思路
在前序遍历中,是先遍历左子树再遍历右子树的。
可以定义一种与前序遍历对称的遍历,先遍历右子树,再遍历左子树。
这样会发现,只要这两种遍历的结果是一样的,那就是对称的二叉树。
有个例外,对于每个节点的值相同的二叉树,遍历后的结果都是一个树,但不一定是对称的。这时需要将 null 判断也放进来。
7
/ \
7 7
/ \ /
7 7 7
如上面的二叉树,两种遍历结果都是 {7, 7, 7, 7, 7, 7},但不是对称的,这时将 null 判断加进来的不一样了。
前序遍历序列为 {7, 7, 7, null, null, 7, null, null, 7, 7, null, null, null}
对称遍历序列为 {7, 7, null, 7, null, null, 7, 7, null, null, 7, null, null}
代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return isSymmetric(root, root);
}
private boolean isSymmetric(TreeNode root1, TreeNode root2) {
// 节点都为 null,说明值相同,则返回 true
if (root1 == null && root2 == null) {
return true;
}
// 其中一个节点为空,说明值不相同,则返回 false
if (root1 == null || root2 == null) {
return false;
}
// 比较两个节点的值,若不相同,则返回 false
if (root1.val != root2.val) {
return false;
}
// 比较二叉树的左右子树是否对称
// && 前面的比较左子树的左子节点与右子树的右子节点
// && 后面的比较左子树的右子节点与右子树的左子节点
return isSymmetric(root1.left, root2.right) && isSymmetric(root1.right, root2.left);
}
}
来源:oschina
链接:https://my.oschina.net/Oaki/blog/3195499