Python二叉树翻转中Node初始化打印与赋值后访问的疑问
问题
我正在尝试用Python实现二叉树翻转,编写了如下代码:
class Node: def __init__(self, data): self.left = None self.right = None self.data = data print(self.left) print(self.right) def PrintTree ( self ) : if self.left : self.left.PrintTree () print ( self.data, end= ' ' ) , if self.right : self.right.PrintTree () class Solution: ''' Function to invert the tree ''' def invertTree(self, root): if root == None: return root.left, root.right = self.invertTree(root.right),self.invertTree(root.left) return root if __name__ == '__main__': Tree = Node(10) Tree.left = Node(20) print(Tree.left.data) Tree.right = Node(30) print(Tree.right.data) Tree.left.left = Node(40) Tree.right.right = Node(50) print('Initial Tree :',end = ' ' ) Tree.PrintTree() Solution().invertTree(root=Tree) print('\nInverted Tree :', end=' ') Tree.PrintTree()
运行后输出如下:
None None None None 20 None None 30 None None None None Initial Tree : 40 20 10 30 50 Inverted Tree : 50 30 10 20 40
我对此感到疑惑:在Node类的__init__方法中打印self.left和self.right时,结果都是None;但在主函数中,我可以通过Tree.left.data、Tree.right.data访问到对应的值,既然初始化时打印的是None,那给tree.left和tree.right赋值的意义是什么?
解答
这是因为初始化和赋值是两个完全不同的时机,理清时间线就能明白:
- 当执行
Tree = Node(10)时,会调用Node的__init__方法,此时self.left和self.right被初始化为None,所以打印出两个None。这时候Tree对象的left和right确实是None。 - 之后执行
Tree.left = Node(20):- 先创建Node(20)对象,调用它的
__init__,打印两个None; - 再把这个新创建的Node对象赋值给Tree的left属性。此时Tree.left就不再是None,而是指向了Node(20)对象,所以你能通过
Tree.left.data访问到20。
- 先创建Node(20)对象,调用它的
- 同理,
Tree.right = Node(30)也是一样的逻辑:创建Node(30)时打印两个None,再把它赋值给Tree.right,此时Tree.right就变成了这个Node对象。
简单来说,初始化时的None是每个Node对象刚诞生时的默认状态,后续的赋值操作是在给这些Node对象的left/right属性“挂载”其他Node节点,从而构建出二叉树的层级结构。如果不做这些赋值,所有节点的左右子节点都会一直是None,根本构不成树。
你代码里的赋值操作正是在搭建二叉树的关系——让根节点Tree拥有左子节点20和右子节点30,再让20拥有左子节点40,30拥有右子节点50,这样才能形成可遍历、可翻转的树结构。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

