您的位置:首页 > 编程语言 > Python开发

二叉树判等IsSame Tree python实现

2018-03-22 17:21 323 查看
最近在找工作啊,真的是一言难尽......常常被些屁都不懂的混子给玩了,大老远把你骗过去问些不着调的问题三两句就打发。偶尔遇见靠谱的算你运气了,就算面不上(条件不符合或不是真的想招人),至少是正经的真正在面试,扯谈也至少扯的是技术,交流中也能互相收获,成长。
废话不多说,又遇到二叉树相关的题,题目虽简单,但用到些经典思路,所以记录下:
判断两个二叉树是否相等
class Node():
    def __init__(self,val,left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

    def IsSame(self, node):
#以上为题干部分, 下面采用先根序遍历(复杂度O(n)=2n)的方法来实现:
        p, q = self, node
        S0 = [] #栈0
        S1 = [] #栈1
        while (p and q) or len(S0):
            if p and q:
                if p.val != q.val:
                    return False
                S0.append(p.right)  #存右置左
                p = p.left
                S1.append(q.right)
                q = q.left
            p = S0.pop()
            q = S1.pop()
            if (p and (not q))or((not p)and q): #有一个不为None
                return False
        return True
其实一开始我也写错了,而且没测,是发出后才知,非常尴尬...错在对象方法中用了递归方法,然后出现回调问题。(NoneType不能通过self调用IsSame方法),这个思路没问题,但须用外函数写才行:

def IsSame(a, b):  #外函数递归方法
    '''如有空树的情况'''
    if (not a)and(not b): #都为None
        return True
    if (not a) or (not b): #有一个不为None
        return False
    if a.val != b.val: 
        return False
    return IsSame(a.left, b.left)and IsSame(a.right, b.right)     
#以下为测试过程        
if __name__ == '__main__':
    # 手动创建一课二叉树
    tree = Node(1,None,None)
    tree.left = Node(2, None, None)
    tree.right = Node(3, None, None)
    tree.left.left = Node(4, None, None)
    tree.left.right = Node(5, None, None)
    tree.right.left = Node(6, None, None)
    tree.right.right = Node(7, None, None)
    tree.left.left.left = Node(8, None, None)
    tree.left.left.right = Node(9, None, None)
    tree.left.right.left = Node(10, None, None)
    tree.left.right.left.right = Node(11, None, None)
    print("手动创建一个二叉树tree\n再创建同样一个tree0")
    tree0 = Node(1,None,None)
    tree0.left = Node(2, None, None)
    tree0.right = Node(3, None, None)
    tree0.left.left = Node(4, None, None)
    tree0.left.right = Node(5, None, None)
    tree0.right.left = Node(6, None, None)
    tree0.right.right = Node(7, None, None)
    tree0.left.left.left = Node(8, None, None)
    tree0.left.left.right = Node(9, None, None)
    tree0.left.right.left = Node(10, None, None)
    tree0.left.right.left.right = Node(11, None, None)
print(tree.IsSame(tree0))
print(IsSame(tree,tree0))
两种方法都可以通过测试。
                  ————欢迎转载,但请注明出处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: