我在用python实现二叉树的过程中发现了python中指针使用的特点,记下来防止遗忘。
利用层序创建二叉树的代码如下:
class Node(object):
def __init__(self,elem):
self.data = elem
self.l_child = None
self.r_child = None
def create_tree(nodelist):
Nodes=[]
if nodelist[0]!=None:
head=Node(nodelist[0])
else:
return None
Nodes.append(head)
j=1
for node in Nodes:
if nodelist[j]!=None:
node.l_child=Node(nodelist[j])
Nodes.append(node.l_child)
print(node.data,node.l_child.data)
j=j+1
if j==len(nodelist):
return head
if nodelist[j]!=None:
node.r_child=Node(nodelist[j])
Nodes.append(node.r_child)
print(node.data,node.r_child.data)
j=j+1
if j==len(nodelist):
return head
其中在将已经创建好的节点放入Nodes这个列表里面时,我使用语句
Nodes.append(node.l_child)
这样做是可以得到一个完整的树的,但如果使用
Nodes.append(Node(nodelist[j]))
那么得到的该节点的l_child及其分支将会全部消失。原因是变量名node.l_child代表了一个原节点的一个指针,指向一个新开辟的节点,而使用Node(nodelist[j])时相当于重新开辟了一个新的树节点,这个节点和原来的树中的节点没有关系。
总结,在python中使用链表,树等需要用一个指针来指向一个与结构体本身同类型(节点类型)的变量的时候,将该变量的变量名赋值给指针,而不是将该变量的内容赋值给指针。
转载请注明出处。