【求助】python问题

顾青研 2018-03-05 09:10:17
Python小白求助,运行结果应该是false,但是不知道为什么运行结果会是true。代码中问号行可以输出,证明进入了循环,但是输出结果是true。代码如下:

class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

def ccompare(p, q):
print(p.val, q.val)
print(p.val != q.val)
if p.val != q.val:
print("???")
return False
else:
if p.left != None and q.left != None:
ccompare(p.left, q.left)
else:
return False
if p.right != None and q.right != None:
ccompare(p.right, q.right)
else:
return False
return True
def isSameTree(p, q):

if p == None and q == None:
return True
elif p != None and q != None:
print(ccompare(p, q))
else:
return False
p = TreeNode(1)
t = TreeNode(2)
q = TreeNode(1)
p.left = t
p.right = q
q.left = p
q.right = t
print(isSameTree(p, q))

请各位大神不吝赐教,不胜感激!
...全文
330 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾青研 2018-03-06
  • 打赏
  • 举报
回复
引用 2 楼 kuangbao9 的回复:
p.left = t p.right = q q.left = p q.right = t 这几句是啥意思?把TreeNode类的实例对象(就是地址)赋给一个值,这个不对吧?应该这样吧: p.left = t.left p.right = q.right q.left = p.left q.right = t.right 这样输出才是False
这几句的意思是p中存储的是根节点为1,左子树为2(同样是一个子树的根节点),右子树为1(同样是一个子树的根节点),按照您这么改,就没有子树了。
顾青研 2018-03-06
  • 打赏
  • 举报
回复
引用 5 楼 u012536120 的回复:
[quote=引用 3 楼 qq_22791547 的回复:] [quote=引用 1 楼 AnonymousRookie 的回复:] 关键需要理解递归的基本思想
非常感谢,您的代码确实简洁也没有问题。但是我还是想要知道我的代码在这个例子里,为什么第十一行问号都可以输出,但是却不返回false?[/quote] 你那个12行的False是return到15或者19行 根本就外层程序没影响。 所以它还是返回最下面的True[/quote] 非常感谢,我明白了。已经解决了。感谢感谢!
sanGuo_uu 2018-03-06
  • 打赏
  • 举报
回复
引用 3 楼 qq_22791547 的回复:
[quote=引用 1 楼 AnonymousRookie 的回复:] 关键需要理解递归的基本思想
非常感谢,您的代码确实简洁也没有问题。但是我还是想要知道我的代码在这个例子里,为什么第十一行问号都可以输出,但是却不返回false?[/quote] 你那个12行的False是return到15或者19行 根本就外层程序没影响。 所以它还是返回最下面的True
sanGuo_uu 2018-03-06
  • 打赏
  • 举报
回复
楼上说的对 问题有2个。 一个是递归。你在递归里直接调用,它是不会停止的。(因为它只是给当前层返回False,该False并没有作用到最外层) 另一个问题是树的赋值,感觉怪怪的
#!/usr/bin/python
# -*- coding: utf-8 -*-

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
         
def ccompare(p, q):
    print('%s,%s'%('None' if p==None else p.val, 'None' if q==None else q.val))
    if p==None or q==None:
        if p==None and q==None:
            return True
        return False

    if p.val != q.val:
        return False
    else:
        zz1=ccompare(p.left, q.left)
        zz2=ccompare(p.right, q.right)
        
        return zz1 and zz2

def isSameTree(p, q):
  
    if p == None and q == None:
        return True
    elif p != None and q != None:
        return ccompare(p, q)
    else:
        return False

p=TreeNode(1)
q=TreeNode(1)
p.left = TreeNode(2)
p.right = TreeNode(1)
q.left = TreeNode(2)
q.right = TreeNode(1)
q.left.left = TreeNode(2)
print(isSameTree(p, q))
kuangbao9 2018-03-06
  • 打赏
  • 举报
回复
p.left = t p.right = q q.left = p q.right = t 这几句是啥意思?把TreeNode类的实例对象(就是地址)赋给一个值,这个不对吧?应该这样吧: p.left = t.left p.right = q.right q.left = p.left q.right = t.right 这样输出才是False
顾青研 2018-03-06
  • 打赏
  • 举报
回复
引用 1 楼 AnonymousRookie 的回复:
关键需要理解递归的基本思想
非常感谢,您的代码确实简洁也没有问题。但是我还是想要知道我的代码在这个例子里,为什么第十一行问号都可以输出,但是却不返回false?
  • 打赏
  • 举报
回复
关键需要理解递归的基本思想

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def isSameTree(p, q):
    if p == None and q == None:
        return True  # 都为空, 则相同
    elif not (p != None and q != None):
        return False # 一个空,一个不空,则不相同
    else:
        if p.val == q.val: # 如果根节点相等, 则判断左右子树是否都相等
            return (isSameTree(p.left, q.left) and isSameTree(p.right, q.right))
        else:
            return False # 如果根节点不相等, 则不相同

p = TreeNode(1)
t = TreeNode(2)
q = TreeNode(1)

p.left = t
p.right = q

q.left = p
q.right = t

print(isSameTree(p, q))

3,423

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧