问 题

class Tree:

def __init__(self, label):

self.root = label

self.child = {}

def set_child(self, label, relate):

self.child[label] = relate

def get_root(self):

return self.root

def get_child(self):

return self.child

这么一颗树结构,该如何写

def create_tree():

create_tree()

来调用树结构递归生成树呢?

如果把对象写在递归函数里,每次都会初始化,所以不行,如果写在函数外面,又无法访问到树的对象,该如何写呢?

还是只能使用字典来生成树?

我尝试使用了

def create_tree():

tree = Tree()

显示是必须传入参数,如果传参,又回初始化树结构,求高人指点

解决方案

好像比較懂你的意思了, 試寫了一個 Tree, 不知道你覺得怎麼樣XD

class Tree:

def __init__(self, name):

self.name = name

self.children = {}

def __iter__(self):

return iter(self.children)

def __str__(self):

return self.name

def __repr__(self):

return 'Tree("{}")'.format(self.name)

def relationiter(self):

yield from self.children.items()

def add_child(self, child, relation):

self.children[child] = relation

return child

def dfs(self, include_self=True):

if include_self:

yield self

for child in self.children:

yield child

yield from child.dfs(False)

def bfs(self, include_self=True):

if include_self:

yield self

trees = list(self.children.keys())

while True:

if not trees:

break

tree = trees.pop(0)

yield tree

trees += list(tree.children.keys())

import and create tree:

In [1]: from tree import Tree

In [2]: root = Tree('root')

...:

...: t11 = root.add_child(Tree('t11'), 30)

...: t12 = root.add_child(Tree('t12'), 40)

...:

...: t21 = t11.add_child(Tree('t21'), 15)

...: t22 = t11.add_child(Tree('t22'), 10)

...: t23 = t11.add_child(Tree('t23'), 35)

...:

...: t24 = t12.add_child(Tree('t24'), 20)

...:

測試 __str__ 跟 __repr__:

In [3]: root

Out[3]: Tree("root")

In [4]: print(root)

root

測試 iterator 和 relation iterator:

In [5]: for child in root:

...: print(child)

...:

t12

t11

In [6]: for child, relation in root.relationiter():

...: print(child, relation)

...:

t12 40

t11 30

測試 dfs 和 bfs:

In [7]: for tree in root.dfs(include_self=True):

...: print(tree)

...:

root

t12

t24

t11

t21

t22

t23

In [8]: for tree in root.bfs(include_self=True):

...: print(tree)

...:

root

t12

t11

t24

t21

t22

t23

這邊還有一個問題是, 不知道你原始的資料長甚麼樣子, 所以我無法猜測你怎麼 create tree。

如果是手動一個一個加入 child 的話應該就像上面那樣, create 跟 recursion 沒什麼關係, traverse 的時候才跟 recursion 有關。

除非你有一個對應於 tree 結構的資料, 字典, json 之類的, 然後你想要依資料自動生成, 可能這種情況才會用 recursion 來 build tree。

因為我對於你實際的輸入不是很了解, 但是我猜你想問的是下面這件事情, 我舉個想像的例子說明這一點, 假設我們的原始資料長這樣:

data = {

't11': {

'relation': 30,

'sub': {

't21': {

'relation': 15

},

't22': {

'relation': 10

},

't23': {

'relation': 35

}

}

},

't12': {

'relation': 40,

'sub': {

't24': {

'relation': 20

},

}

}

}

我必須要將這樣子的資料建出一個 Tree 來, 這邊的確就跟 recursion 有關了, 首先我在 Tree 中增加一個 classmethod:

@classmethod

def from_data(cls, name, data):

tree = cls(name)

if data:

for subname, subdata in data.items():

tree.add_child(

cls.from_data(subname, subdata.get('sub', None)),

subdata['relation'])

return tree

接著我可以用下面這種方式 recursive 地 create tree:

root = Tree.from_data('root', data)

測試:

for tree in root.bfs():

print(tree)

for child, relation in tree.relationiter():

print(' {}-{}'.format(child, relation))

結果:

root

t12-40

t11-30

t12

t24-20

t11

t21-15

t23-35

t22-10

t24

t21

t23

t22

P.S. 有問題歡迎討論!

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

python 画树 递归_数据结构 - python如何递归生成树?相关推荐

  1. python画交互式地图_使用Python构建交互式地图-入门指南

    python画交互式地图 Welcome to The Beginner's Guide to Building Interactive Maps in Python 欢迎使用Python构建交互式地 ...

  2. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  3. python画猪头_使用Python画小猪佩奇 社会人标配

    看了一些用python实现小猪佩奇画画的帖子,向自己实现下,以此记录. 社会人的标配是谁,当然是吹风机小猪佩奇身上纹. 我自己尝试画过小猪配齐但是感觉眼睛特别难画,画出来的猪头没有立体感,眼睛画不好整 ...

  4. python画雪花流程图_用python画雪花,Python

    # 用Python画雪花 # 学习https://www.toutiao.com/i6787554710594257420/?tt_from=weixin&utm_campaign=clien ...

  5. 如何用python画金字塔形状_用Python画小猪佩奇,落叶树和动漫人物

    本文目录:小猪佩奇-落叶树-魔法少女 本文作者:小赖同学 ​ 最近在浏览Python文章时,无意中发现了一个好玩的画图工具turtle,看到各路大神竟然用Python画了一个图片出来,无法用言语来形容 ...

  6. 如何用python画金字塔形状_用 Python 画一只福鼠

    今年这个鼠年,尽管只是刚过了一个开头,但现实仿佛把我们很多年才需要经历的不好的事情,都在一瞬间抛向了我们,这个鼠年好像缺了点福气,本节我们使用 Python 画一只福鼠,为大家增添点福气,我们需要用到 ...

  7. 如何用python画爱心代码_用 python 画爱心代码讲解

    学计算机的男生发这个给我看是什么意思?​www.zhihu.com 原理其实挺简单的. 代码网上也有. 最难的部分前人都告诉我们了, 心形可画. 要自己推导通过泰勒各种扭也可以. 通过肉眼扭我感觉也不 ...

  8. python画卡通人物_用Python 绘制儿童卡通人物,一起过儿童节

    又到一年一度的国际儿童节,今天我们来学习一下用 Python 的 Turtle 库绘制童年的卡通人物,一起做回年轻的那个少年. Turtle图形库,又称海龟库,是 Python 语言中一个很流行的绘制 ...

  9. 用python画风景诗_关于Python turtle 绘图

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 先说明一下turtl ...

最新文章

  1. java post接口测试_接口测试——Java + TestNG 国家气象局接口(json解析)实例
  2. C++中运算符重载需要遵循的规则
  3. Packet Tracer 5.0实验(五) 快速生成树配置
  4. VC编程实现IE风格的界面
  5. 构建高性能.NET应用之配高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)
  6. 带有ActiveMQ和Maven的JMS Sender应用程序
  7. c中将数组传递给子函数_在C ++中将对象传递给Non-Member函数
  8. error: style attribute '@android:attr/windowEnterAnimation' not found
  9. php音视频同步,视频画面和声音不同步?视频声音画面同步工具|软件
  10. RuntimeError: Found 0 files in subfolders of: ./data/image Supported extensions are: .jpg,.jpeg,.png
  11. linux版本的redis bin,redis-4.0.2.tar.gz for centos的linux系统版本下载(安装详细步骤)...
  12. 滴滴顺风车回归倒计时!
  13. HTTP 请求头(首部)一览表
  14. 谷歌浏览器开启JavaScript
  15. win xp安装详细教程
  16. NI控件之 CWGraph使用(COM)
  17. 可爱的python测试开发库(python测试开发工具库汇总)
  18. oracle判断字符串以什么开头_在sql查询字段中怎么去判断是以某字母开头
  19. heritrix mysql_Heritrix使用小结
  20. Android获取String的MD5值

热门文章

  1. 如何在Global.asax中判断是否是ajax请求
  2. js 获取某年的某天是第几周
  3. 由表单中onsubmit=return false;想到的
  4. 第七章 scikit-learn与机器学习实战
  5. 【Breadth-first Search 】103. Binary Tree Zigzag Level Order Traversal
  6. [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]
  7. linux 5识别网卡,CentOS 5.5系统识别不了Atheros AR8151网卡怎么办?
  8. python task done_python queue task_done()问题
  9. java序列化写法_java-spark的各种常用算子的写法
  10. 基于MATLAB的Dijkstra算法实现及案例分析