解题思路:
对称二叉树定义: 对于树中 任意两个对称节点 LL 和 RR ,一定有:
-
L.val = R.valL.val=R.val :即此两对称节点值相等。
-
L.left.val = R.right.valL.left.val=R.right.val :即 LL 的 左子节点 和 RR 的
右子节点 对称; -
L.right.val = R.left.valL.right.val=R.left.val :即 LL 的 右子节点 和 RR 的
左子节点 对称。
根据以上规律,考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : recur(root.left,root.right);
}
boolean recur(TreeNode Left,TreeNode Right){
if(Left == null && Right == null) return true;
if(Left == null || Right == null || Left.val != Right.val) return false;
return recur(Left.left,Right.right) && recur(Left.right,Right.left);
}
}
复杂度分析:
- 时间复杂度 O(N): 其中 N为二叉树的节点数量,每次执行 recur() 可以判断一对节点是否对称,因此最多调用 N/2次 recur() 方法。
- 空间复杂度 O(N): 最差情况下(见下图),二叉树退化为链表,系统使用 O(N) 大小的栈空间。