Python实现列表树

因为Python列表中的元素可以是列表,所以可以使用列表构建树形结构。

构建指定层数的满二叉树:

def build_tree_depth(tree, n, m, data):#data是结点的数据,构造指定层数的满二叉树
	#控制层数
	if n == m - 1:
		tree.append(data)
		return data
	else:
		tree.append(data)
		tree.append([])#创建左子树
		data += 1#改变结点的值(这里只是一个实例而已)
		data = build_tree_depth(tree[1], n+1, m, data)#递归实现创建

		tree.append([])#创建右子树
		data += 1
		data = build_tree_depth(tree[2], n+1, m, data)#递归实现创建
	return data
if __name__ == '__main__':
	tree = []
	n = 0
	m = 4
	data = 0
	build_tree_depth(tree, n, m, data)#n,m控制数的层数,data为结点的数据
	print(tree)
[0, [1, [2, [3], [4]], [5, [6], [7]]], [8, [9, [10], [11]], [12, [13], [14]]]]
[Finished in 0.2s]

 

搜索满二叉树:

def search_tree_depth(tree, data):#深度优先遍历
	data.append(tree[0])#data记录各个结点的数值
	if len(tree) != 1:#递归实现
		search_tree_depth(tree[1], data)
		search_tree_depth(tree[2], data)
	return 0
if __name__ == '__main__':
	tree = []
	n = 0
	m = 4
	data = 0
	build_tree_depth(tree, n, m, data)#n,m控制数的层数,data为结点的数据


	data_search = []
	search_tree_depth(tree, data_search)
	print(data_search)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
[Finished in 0.2s]

 

搜索某一路径下的结点:

 上面我们创建的二叉树如下:

我们希望得到路径:0,1,2之后的结点,或路径0,1之后的结点:

def search_leaf(tree, data, road, result):#搜索某一路径下的任意结点
	road.append(tree[0])
	if len(tree) != 1:
		search_leaf(tree[1], data, road, result)
		search_leaf(tree[2], data, road, result)
	else:
		if road[:len(data)] == data[:]:
			result.append(tree[0])
			del(road[-1])
			return 0
	del(road[-1])
	return 0
if __name__ == '__main__':
	tree = []
	n = 0
	m = 4
	data = 0
	build_tree_depth(tree, n, m, data)#n,m控制数的层数,data为结点的数据


	data_search = []
	search_tree_depth(tree, data_search)
	
	data = [0, 1, 2]
	road = []
	result = []
	search_leaf(tree, data, road, result)
	print(result)

	data = [0, 1]
	road = []
	result = []
	search_leaf(tree, data, road, result)
	print(result)
[3, 4]
[3, 4, 6, 7]
[Finished in 0.2s]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值