Same Tree

来源:互联网 发布:淘宝app用户体验报告 编辑:程序博客网 时间:2024/06/03 21:17

leetcode第100题,典型的二叉树的问题,判断两个数是否为相同的二叉树,要求节点数据和树的结构必须完全相同。

一开始考虑的是进行树的遍历,因为二叉树的前序遍历加上中序遍历或者后序遍历加上中序遍历可以唯一确定二叉树结构,因此考虑先进行两种遍历,然后比较结果就行了。但是这样做有一个bug,那就是如果元素相同,就无法区分元素是在哪个节点上了,这样一来,遍历结果就不能确定结果了。

贴上这种笨办法的代码

def isSameTree( p, q):    """    :type p: TreeNode    :type q: TreeNode    :rtype: bool    """    if p == None and q == None:        return True    if (p == None and q!=None) or (p!=None and q == None):        return False    def in_Order(root,l):        if root.left != None:            in_Order(root.left,l)        if root.val == None:            l.append(0)        else:            l.append(root.val)        if root.right != None:            in_Order(root.right,l)    def pre_Order(root,l):        if root.val == None:            l.append(0)        else:            l.append(root.val)        if root.left != None:            pre_Order(root.left,l)        if root.right != None:            pre_Order(root.right,l)    def campare(l1,l2):        n1 = len(l1)        n2 = len(l2)        if n1 != n2:            return False        for i in range(n1):            if l1[i] == l2[i]:                continue            else:                return False        return True    preOrder1 = []    inOrder1 = []    preOrder2 = []    inOrder2 = []    in_Order(p,inOrder1)    in_Order(q,inOrder2)    pre_Order(p,preOrder1)    pre_Order(q,preOrder2)    if campare(inOrder1,inOrder2) and campare(preOrder1,preOrder2):        flag = True    else:        flag = False    return flag

既然如此,采取另一种方法,一边递归遍历,一边进行比较,这样就可以确保能够完全相同了。

这样做相当于是两棵树进行深搜,需要一定的技巧,首先对两棵树搜索,输入参数肯定就是两棵树的节点,上来先判断两棵树都是空树的情况。而后进行深搜,搜索时先比较节点的值是否相等,如果不等就直接返回False,如果相等继续向下遍历。

要注意的是,有时候有点节点是空的,这时候需要用到hasattr函数,确保该节点有值的属性,如果没有,这说明结构已经不一样了,就可以直接返回False了。

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution(object):        def isSameTree(self, p, q):        """        :type p: TreeNode        :type q: TreeNode        :rtype: bool        """        if not (p or q):            return True        elif (hasattr(p, 'val') and hasattr(q, 'val')) and p.val == q.val:                if self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right):                    return True                else:                    return False        else:            return False



0 0
原创粉丝点击