python递归必须要有_python如何递归生成树?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018秋季C语言学习总结

转载于:https://www.cnblogs.com/noacgnnolife/p/10413255.html

java取非_java运算符 与()、非(~)、或(|)、异或(^)

1.位异或运算(^)运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。比如:8^11.8转为二进制是1000,11转为二进制是1011.从高位开始比较得到的是:0011.然后二进制转为十…

JOOQ事实:从JPA批注到JOOQ表映射

JOOQ是一个简洁的框架,它解决了我在使用高级动态过滤查询时遇到的一个长期问题。 虽然Hibernate和JPA附带了一个有用的Criteria API(我已经使用了很长一段时间),但是使用它们时所能做的却有一些可以理解的限制。 例如,…

解决Charles手机安装SSL证书后,获取到的接口为unknown,且乱码问题

按照正常流程将Charles安装并设置代理后,手机添加完代理并安装SSL证书,尝试抓取接口时,获取到的接口为unknown且返回内容乱码,如下图所示 解决办法: 在Proxy-SSL Proxying Settings-SSL Proxying下添加想要抓取的服务地…

Sum of Even Numbers After Queries

Solution: 转载于:https://www.cnblogs.com/Julietma/p/10414394.html

python的颜色有哪些_Python颜色分类及格式

Python字符串颜色使用下面方式进行修改\033[显示方式;字体色;背景色m 字符串 \033[0m显示方式包括:0 终端默认设置1 高亮显示4 使用下划线5 闪烁7 反白显示8 不可见字体颜色 | 背景颜色 | 颜色描述-------------------------------------------3…

我们甚至没有进行包容性的讨论

科技行业需要更加包容女性和有色人种。 这是关于拥有最大的人才库以吸取卓越的经验。 可悲的是,大多数讨论,甚至是倡导更具包容性的文化讨论,本身都是分裂的。 我们都是个人 我们都是个人。 我们都有自己的优点和缺点。 我们都有自己一生以…

第一次连接mysql失败_MySQL 远程连接失败

解决服务器能登陆 MySQL , 远程账户不能链接问题。(第一次遇见还是挺蒙的)一、 配置文件执行顺序/etc/my.cnf/etc/mysql/my.cnf/usr/etc/my.cnf~/.my.cnf二、用户密码注 : 服务器 tx 云 , OS ubuntu 18.4。1、linux ssh 端口 22 登陆账号密码…

Python学习week7-文件操作

1、文件IO常用操作 # 文件操作命令 2、打开操作open # open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 创建并打开一个文件test,然后关闭;打开一个文件,返回一个文件对象(流对…

将一个实体转换成 Url 参数的形式 ?a=ab=b

function toQueryString(obj) { var ret []; for (var key in obj) { key encodeURIComponent(key); var values obj[key]; if (values && values.constructor Array) { //数组 var queryValues []; for (var i 0, len values.length, value; i < len; i ) …

Spring Boot –现代Java应用程序的基础

Spring Boot是Spring.io中一个相对较新的项目。 其目的是简化创建新的基于Spring Framework的项目&#xff0c;并通过应用一些约定来统一其配置。 这种关于配置的方法约定已经成功地应用于大多数所谓的现代Web框架中&#xff0c;例如Ruby on Rails&#xff0c;Django或Play&…

python qt快速入门_PyQt5快速入门(一)

PyQt5快速入门(一)前言为什么选择PyQt5作为GUI框架?API与Qt一致, 学会PyQt后再使用qt很简单开发迅速, 可视化操作,使用designer快速拖拽布局进行调试可以将文件打包成exe进行发布本节课内容(假设已经掌握python语法)搭建PyQt5环境测试PyQt5环境本节课使用环境python 3.6.6IDLE…

风险定量分析工具 龙卷风图 决策树形图 蒙特卡洛模拟

龙卷风图&#xff1a;是项目管理中用于在风险识别和定性分析之后&#xff0c;进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 敏感性分析&#xff1a;敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不确定因素保持在基准值的条件下…

java 先序遍历_二叉树的前序中序后序遍历(java代码)

importjava.util.*;public classtraversal {public static voidmain(String[] args) {List listnewArrayList<>();//构造二叉树TreeNode treeNode6newTreeNode(2,null,null);TreeNode treeNode5newTreeNode(1,null,null);TreeNode treeNode4newTreeNode(7,null,null);Tre…

js正则验证方法大全

/* 用途&#xff1a;检查输入手机号码是否正确 输入&#xff1a; s&#xff1a;字符串 返回&#xff1a; 如果通过验证返回true,否则返回false */ function checkMobile(s) { var regu /^[1][3][0-9]{9}$/; var re new RegExp(regu); if (re.test(s)) { return true; } els…

使用CLI设置WildFly绑定地址并关闭

仅使用命令行参数将WildFly绑定到主机名/ IP上非常容易。 我有一个简单的GNU / Linux盒子&#xff0c;可以用它玩各种东西&#xff0c;其中之一就是WildFly。 我使用以下命令开始在特定IP上监听WildFly&#xff1a; $> cd /opt/wildfly/wildfly-8.0.0.Beta1/bin $> ./s…

JS基本数据类型

基本数据类型&#xff1a; Undefined&#xff0c;null&#xff0c;boolean&#xff0c;number&#xff0c;string symbol&#xff08;ES6&#xff09; 复杂数据类型&#xff1a; object undefined: 变量声明未初始化&#xff0c;自动为undefined typeof 操作符检测变量数据类型…

用python自制背单词程序_c++自制背单词应用

文件结构&#xff1a;背词历史.log 用来存放背过的单词&#xff0c;存放的格式是年-月-日 时&#xff1a;分&#xff1a;秒单词 词性 中文解释生词本.txt 用来存放当下要背诵的单词列表&#xff0c;格式是单词 词性 中文解释历史记录.txt 用来当做按照时间查询生词的缓存&#…

mongodb lbs java_LBS JAVA Spring mongoDB

基本介绍位置服务(LBS)解决的主要问题是当前位置周围某个范围内的人或场所.在传统的解决方案,开发人员需要根据复杂的几何运算与大量的SQL语句进行查找,这无疑加大的开发人员的开发难度.现在我们需要更为方便的解决方案,MongoDB为我们完美解决此类LBS问题.此篇文章也主要使用Sp…

让height: 100%生效

html&#xff1a; <body><div class"box"></div> </body> css&#xff1a; .box{position: fixed;// 使用fixed定位width: 100%;height: 100%;background: orange;} 补充&#xff1a; &#xff08;父元素不设高度&#xff0c;如何让子元素高…