题目来自LeetCode,链接:面试题28. 对称的二叉树。具体描述为:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
二叉树的题目,毫无疑问还是可以用递归来解决。判断是否镜像对称首先需要判断当前节点的左子节点left
和右子节点right
是否值相等,然后又需要判断左子节点的左子节点left.left
和右子节点的右子节点right.right
是否相等,以及左子节点的右子节点left.right
和右子节点的左子节点right.left
是否相等,这里两个对于子节点的操作明显就是需要递归去做了嘛。时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
n
)
O(n)
O(n)(最坏的情况下即在二叉树退化为两个单链表的情况下,左子节点只有左子节点,右子节点只有右子节点,此时递归栈所需的空间)。
JAVA版代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private boolean symmetric(TreeNode left, TreeNode right) {
if (left == null || right == null) {
return left == right;
}
if (left.val != right.val) {
return false;
}
return symmetric(left.left, right.right) && symmetric(left.right, right.left);
}
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return symmetric(root.left, root.right);
}
}
提交结果如下:
Python版代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if root is None:
return True
def symmetric(left, right):
if left is None or right is None:
return left is None and right is None
if left.val != right.val:
return False
return symmetric(left.left, right.right) and symmetric(left.right, right.left)
return symmetric(root.left, root.right)
提交结果如下: