抱歉,这是一个常见问题,但是我没有针对我的特定问题找到合适的答案.我正在尝试实现一种walk方法,该方法将二叉树从其根节点移动到其每个叶节点,并在到达叶节点时产生从根到叶的路径.例如,遍历由以下表示的二叉树:

__a__

/ \

b d

/ \ / \

- c - -

将产生:

['a','b','c']

['a','d']

我的想法是BinaryTree.walk在根节点上调用Node.traverse,而后者又递归地调用每个子节点的traverse方法. BinaryTree.walk还创建一个空列表,该列表随每个遍历调用一起传递,附加每个节点的数据,一旦到达叶节点就产生该列表,并在访问每个节点后将每个元素从列表中弹出.

在某些时候,尽管出了点问题.这是我的代码:

class Node:

def __init__(self,data=None,left=None,right=None):

self.data = data

self.left = left

self.right = right

def __repr__(self):

return f"{self.__class__.__name__}({self.data})"

@property

def children(self):

return self.left,self.right

def traverse(self,branch):

print('ON NODE:',self)

branch.append(self.data)

if self.left is None and self.right is None:

yield branch

else:

for child in self.children:

if child is not None:

print('ENTERING CHILD:',child)

child.traverse(branch=branch)

print('EXITING CHILD:',child)

branch.pop()

class BinaryTree:

def __init__(self,root=Node()):

if not isinstance(root,Node):

raise ValueError(f"Tree root must be Node,not {type(root)}")

self.root = root

def __repr__(self):

return f"{self.__class__.__name__}({self.root})"

def walk(self):

node = self.root

branch = []

yield from node.traverse(branch=branch)

if __name__ == '__main__':

# create root node

n0 = Node('A')

# create binary tree with root node

tree = BinaryTree(root=n0)

# create others nodes

n1 = Node(data='B')

n2 = Node(data='C')

n3 = Node(data='D')

# connect nodes

n0.left = n1

n0.right = n3

n1.right = n2

# walk tree and yield branches

for branch in tree.walk():

print(branch)

预期产量:

ON NODE: Node(A)

ENTERING CHILD: Node(B)

ON NODE: Node(B)

ENTERING CHILD: Node(C)

ON NODE: Node(C)

['A','B','C'] # yielded branch

EXITING CHILD: Node(C)

EXITING CHILD: Node(B)

ENTERING CHILD: Node(D)

ON NODE: Node(D)

['A','D'] # yielded branch

EXITING CHILD: Node(D)

实际输出:

ON NODE: Node(A)

ENTERING CHILD: Node(B)

EXITING CHILD: Node(B)

ENTERING CHILD: Node(D)

EXITING CHILD: Node(D)

IndexError: pop from empty list

我知道我对列表做错了,因为它在空时尝试弹出,但是我不明白它是怎么做到的.它应该为每个追加调用调用一次pop.

我也无法弄清楚为什么要输入和退出节点,但是没有显示ON NODE:消息…就像我的代码以某种方式跳过child.traverse(branch = branch)行一样?

谁能帮助我了解我在哪里搞砸了?

在此先感谢您的帮助!

python列表表示二叉树_python-产生二叉树的所有从根到叶的分支相关推荐

  1. python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  2. python列表生成字典_Python 列表生成式 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  3. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  4. python列表切片图解_Python列表切片操作实例总结

    本文实例讲述了Python列表切片操作.分享给大家供大家参考,具体如下: 切片指的是列表的一部分. 1 基本用法 指定第一个元素和最后一个元素的索引,即可创建切片 .Python 会在到达指定的第二个 ...

  5. python列表存储乱码_python 列表中文乱码

    今天在学习python列表的时候遇到中文乱码问题,如下: # -*- coding: UTF-8 -*- print "列表" list1 = ['张三',"李四&quo ...

  6. python 列表自动排序_Python学习小技巧之列表项排序的示例代码分享

    这篇文章主要给大家介绍了Python学习小技巧之列表项排序的相关资料,文中介绍的非常详细,需要的朋友们可以参借鉴,下面跟着小编一起来学习学习吧. 本文介绍的是关于Python列表项排序的相关内容,分享 ...

  7. python列表生成器语法_Python 列表生成式\生成器

    Python 列表生成式+生成器 一.列表生成式 1.什么是列表生成器 一种可以便捷地生成列表的表达式,有时候可以替换list.append(变量) 2.需求. 如何将列表中的每个数据都加1 列表:d ...

  8. python列表比较方法_python列表常用方法

    list是一个类,用中括号括上,逗号分隔,元素可以是数字,字符,字符串,也可以是嵌套列表,布尔类型. 1.通过索引取值 li=[1,12,9,'age',['wangtianning',[19,'10 ...

  9. python列表增加一行_Python 列表中的修改、添加和删除元素的实现

    本文介绍的是列表中的修改.添加和删除元素.第一次写博客,如果本文有什么错误,还请大家评论指正.谢谢! 创建的列表大多数都将是动态的,这就意味着列表创建后,将随着程序的运行删减元素. 修改列表元素 修改 ...

最新文章

  1. Netdata---Linux系统性能实时监控平台部署记录
  2. sl中几个简单变量的获取
  3. __name__ ==“ __main__”怎么办?
  4. Python 是一门怎样的语言
  5. hosts文件_电脑修改hosts文件屏蔽网站方法
  6. 马斯克认为 AI 必超越并威胁人类,他宁愿搞脑机接口也不碰AI
  7. 一个IT经理眼中的RTX、Simba2013与Lync
  8. excel 字符串拼接_Excel教程:应收账款自动弹窗提醒
  9. ModelArts的雪中送炭,让我拿下CCF BDCI华为Severless工作负载预测亚军
  10. 计算机主板的1117标识,AMS1117封装尺寸图_AMS1117引脚图及功能 - 全文
  11. mac环境下安装mysql
  12. Adblock PLus 插件chrome用
  13. macpro的IDEA常用快捷键~持续更新
  14. . NET多线程编程
  15. excel oss 上传_阿里云对象存储OSS全系统教程
  16. 关于OGG trail file 到999999之后的处理方法
  17. APE转MP3的转换码率说明
  18. 个人独资公司税收标准
  19. Typora 主题 艾米莉亚
  20. Manjaro21-kde版安装全记录

热门文章

  1. ICCV 2021 | 简而优:用分类器变换器进行小样本语义分割
  2. 20分钟+1080显卡,能跑多复杂的模型?
  3. 关于Vision Transformer的一些思考
  4. 日读论文100+,AI都替代不了!辞去医药研发总监后,她成为了一名全职学术警察...
  5. 32岁程序员,失业4个月45次面试经历,与君共勉
  6. Tornado自定义分布式session框架
  7. Django博客系统(写博客页面展示分类)
  8. 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim
  9. 2019年计算机考研408真题
  10. JSP第二次作业_1小题