Same Tree

两颗树同构判断很简单,首先两个树的结点同步移动,当前位置值相等之后再比较两颗子树即可,要不同时当前节点为空,要不同时有且值相等

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if p and q:
            return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
        return p is q

Symmetric Tree

这题和上题可以说完全一样的,上面是找一模一样,这里找的是对称一样,我们只需要把helper函数里传参的地方稍改一下就可以了

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.helper(root, root)

    def helper(self, left, right):
        if left and right:
            return left.val == right.val and self.helper(left.left, right.right) and self.helper(left.right, right.left)
        return left is right

此题还可以用迭代法求解,思路是利用BFS和队列了,也是每一个遍历的点来两份,一份往左一份往右就可以检查对称了,这里就不实现了

迭代的方法比较需要注意节点是否为空

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        queue = collections.deque([root, root])
        while queue:
            node1, node2 = queue.pop(), queue.pop()
            if not node1 and node2:
                return False
            elif not node2 and node1:
                return False
            elif node1 and node2 and node1.val != node2.val:
                return False
            if node1:
                queue.appendleft(node1.left)
            if node2:
                queue.appendleft(node2.right)
            if node1:
                queue.appendleft(node1.right)
            if node2:
                queue.appendleft(node2.left)
        return True

results matching ""

    No results matching ""