接下来一段时间小编会和大家一起学习数据结构用python描述。
C/C++可以通过使用链表来创建二叉树,当然python也可以,但是现在的问题是
python没有指针和引用。C/C++创建链表二叉树需要使用指针和引用,而python没有。
怎么办呢?
首先先来看一下变量在python中的储存机制,python是使用引用计数的办法。
通俗的说,在python中对于一个值来说就有一个地址,而在C/C++中一个变量有一个地址
在python当中一个变量的值改变的时候,他的地址就会发生改变
如:
a=10
print(id(a))
a=20
print(id(a))
"""
输出结果:
140721907888160
140721907888480
"""
python中除了列表、元组等序列类型可以发生改变一般的局部变量通过函数传递在函数中改变并不能改变变量的值。在python中变量传递都是引用传递
如:
def Change(L):
print(id(L))#B
L=10
print(id(L))#C
def main():
L=5
print(id(L))#A
Change(L)
print(L,id(L))
main()
"""
输出结果:
140721907888000
140721907888000
140721907888160
5 140721907888000
"""
我们可以发现A处和B处输出的地址是一样的,说明他们是同一个变量,则说明python的变量传递时引用传递。但是主函数main中的L的值并没有发生改变,C处的地址发生改变原因与最上面的原因一样。
由上面看我们发现函数传递的时候并不能改变实参。也就是说根节点左孩子和右孩子不能发生改变始终都是None,那么我们怎么解决这个问题呢?我们可以将得到的结点再返回去:
我们现在来创建一颗这样的二叉树:
#coding=gbk
class Binary_Tree():
def __init__(self,data=0,Left_child=None,Right_child=None):#初始化变量
self.data=data
self.Left_child=Left_child#左孩子
self.Right_child=Right_child#右孩子
def Creat_Binary_Tree(Root):
if Data_Input[0]!=0:
Root=Binary_Tree(Data_Input[0])#给Root赋给空间并且初始化
Data_Input.pop(0)#pop处第一个数据,这样第一个数据就是原来的第二个位置上的数据如原来是[1,2,3]这样就变成[2,3]
print(Data_Input)#输出当前列表中的元素
Root.Left_child=Creat_Binary_Tree(Root.Left_child)
Root.Right_child=Creat_Binary_Tree(Root.Right_child)
return Root#将得到的节点返回
else:
Root=None#当data=0的时候就递归停止,就不继续产生节点
Data_Input.pop(0)
print(Data_Input)
def Inorder(Root):
if Root != None:
Inorder(Root.Left_child)
print(Root.data,end=' ')
Inorder(Root.Right_child)
Data_Input=[2,3,4,0,5,0,0,0,6,7,0,0,8,0,0]#创建二叉树需要的数据当data=0的时候就递归停止
def main():
Root=None
Root=Creat_Binary_Tree(Root)
Inorder(Root)#中序遍历二叉树
main()
"""
输出结果:
[3, 4, 0, 5, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0]
[4, 0, 5, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0]
[0, 5, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0]
[5, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0]
[0, 0, 0, 6, 7, 0, 0, 8, 0, 0]
[0, 0, 6, 7, 0, 0, 8, 0, 0]
[0, 6, 7, 0, 0, 8, 0, 0]
[6, 7, 0, 0, 8, 0, 0]
[7, 0, 0, 8, 0, 0]
[0, 0, 8, 0, 0]
[0, 8, 0, 0]
[8, 0, 0]
[0, 0]
[0]
[]
4 5 3 2 7 6 8
"""
------------------------------------------------------END------------------------------------------------------