python构造二叉树_【数据结构用python描述】python创建二叉树

接下来一段时间小编会和大家一起学习数据结构用python描述。

C/C++可以通过使用链表来创建二叉树,当然python也可以,但是现在的问题是

python没有指针和引用。C/C++创建链表二叉树需要使用指针和引用,而python没有。

怎么办呢?

首先先来看一下变量在python中的储存机制,python是使用引用计数的办法。

通俗的说,在python中对于一个值来说就有一个地址,而在C/C++中一个变量有一个地址

在python当中一个变量的值改变的时候,他的地址就会发生改变

如:

a=10

print(id(a))

a=20

print(id(a))

"""输出结果:140721907888160140721907888480"""

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()

"""输出结果:1407219078880001407219078880001407219078881605 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------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值