好像比較懂你的意思了, 試寫了一個 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. 有問題歡迎討論!

python递归必须要有_python如何递归生成树?相关推荐

  1. python递归必须要有_Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  2. python递归出口怎么写_Python进阶 —— 递归

    作者是一名沉迷于Python无法自拔的蛇友,为提高水平,把Python的重点和有趣的实例发在简书上. 递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归 ...

  3. python实现数字循环相加_python使用递归、尾递归、循环三种方式实现斐波那契数列...

    在最开始的时候所有的斐波那契代码都是使用递归的方式来写的,递归有很多的缺点,执行效率低下,浪费资源,还有可能会造成栈溢出,而递归的程序的优点也是很明显的,就是结构层次很清晰,易于理解. 可以使用循环的 ...

  4. python递归是什么意思_Python——谈谈递归的深度问题

    前言: 用过python递归的同学可能都碰到过:RecursionError: maximum recursion depth exceeded while getting the str of an ...

  5. python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  6. python遍历任意层次字典_Python递归中 return 代码陷阱

    1 #获取字典中的objkey对应的值,适用于字典嵌套 2 #targetDict:要查找的字典;serchKey:要查找的目标key 3 #ret:递归过程中,向外部(上层)传送 return值.被 ...

  7. python中回文设计_Python中的回文递归

    我正在编写一个Python代码,其中我必须使用递归来测试列表是否是回文,并且遇到代码中的混乱和问题:def isPalindrome( thesublist ) : thesublisttest = ...

  8. python递归详解_Python理解递归的方法总结

    递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...

  9. 在python中用递归的方法编程_python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量, ...

最新文章

  1. 从实际案例聊聊Java应用的GC优化
  2. Windows Mobile下访问Sqlite的Native C++封装
  3. 做技术的,这些观点真的扯淡!
  4. JNI开发笔记(七)--aar库的生成和调用
  5. shiro多Realm分别授权
  6. C#网络编程(五)----基于TCP的简易多客户端聊天
  7. 【期刊推荐】JCR2区数学算法优化类重点SCI期刊征稿中~
  8. MySql 8.0对应的驱动包
  9. VIMS(虚拟镜像管理系统)
  10. 抗变态或亲变态是更好的解决方案
  11. 葡萄城报表介绍:自由报表
  12. 用TW8836驱动ST7701S TTL屏调试记录
  13. Swift —— 类与结构体
  14. 阿里官方Java代码规范标准解析 - 基本数据类型与包装数据类型的使用标准
  15. 解决浏览器弹出 安全警告当前网页正在视图打开您的受信任的站点列表中的站点,您想允许这样做吗?
  16. 基于51单片机的超声波避障小车设计(含Proteus仿真)
  17. Grin爆红,只是因为它的笑脸吗?
  18. 计算机PS设计策划,ps关于ps设计的理念和思路
  19. 特斯拉上海工厂二期进展神速:已经开始建造屋顶
  20. 苹果手机之间怎么传照片_相机与手机之间传送RAW格式照片问题!

热门文章

  1. ps法线贴图插件_法线与置换贴图原理讲解以及烘焙制作!
  2. ping 不通 华为三层交换机vlan_华为三层交换机如何让VLAN间不能互通配置精编版...
  3. python ssl_Python3 ssl模块不可用的问题
  4. java excel 导出图片_JAVA 使用 POI 导出 EXCEL 自定义背景颜色
  5. 计算机网络流量图阅读与理解,计算机网络流量监控的设计与实现
  6. 新手上路之django项目开发(二)-----mysql数据库配置及其增删改查操作
  7. 字符串工具类,随机生成字符串
  8. c语言错误重定义,C语言的重定义错误求解
  9. elementUI之switch应用的坑
  10. JS设计模式(2)策略模式