python - 如何将节点字典转换为二叉树?[Python]
问题描述
我有一个对象字典,其中包含键 [Node Value] 及其左右节点的列表。样本字典:
{1: [2, 3], 2: [4, 0], 3: [None, 5], 4: [6, None], 5: [None, 7], 6: [8, None], 7: [None, 9], 8: [None, None], 9: [None, None]}
我的示例节点类:
class Node:
def __init__(self,key):
self.left = None
self.right = None
self.val = key
如何将字典转换为二叉树?
解决方案
您可以使用递归:
class Tree:
def __init__(self, _val = None):
self.val = _val
self.right, self.left = None, None
def __iter__(self):
yield self.val
yield from [[], self.left][bool(self.left)]
yield from [[], self.right][bool(self.right)]
def _insert_vals(self, _start, _d):
self.val = _start
for a, b in zip(['left', 'right'], _d.get(_start, [])):
if b is not None:
setattr(self, a, Tree())
getattr(self, a)._insert_vals(b, _d)
d = {1: [2, 3], 2: [4, 0], 3: [None, 5], 4: [6, None], 5: [None, 7], 6: [8, None], 7: [None, 9], 8: [None, None], 9: [None, None]}
t = Tree()
t._insert_vals(1, d)
print([i for i in t])
输出:
[1, 2, 4, 6, 8, 0, 3, 5, 7, 9]
编辑:更短:
class Tree:
def __init__(self, _val, _r, _d):
self.v, self.right, self.left = _val, None, None
if _r:
l, r = _r
self.left, self.right = Tree(l, _d.get(l, []), _d), Tree(r, _d.get(r, []), _d)
t = Tree(1, d[1], d)
推荐阅读
- android - 从另一个片段导航回来时自定义视图的奇怪行为
- c# - 如何配置 GRPC 双向流以在 .NET 中发送字节
- r - R中data.frame中的日期重叠
- php - 在php中按最后一个字符对数组列表进行排序
- c# - 使用密码加密的 c# 代码的用户登录模块不起作用
- spring-boot - GetMapping 工作,但 PostMapping 在 SpringBoot 应用程序中不起作用
- python-3.x - (Xpath,scrapy)如何不包含这个html的子标签
- flutter - flutter web socket如何连接?
- python - 什么是 !pip(砰点子)?
- jointjs - 如何从jointjs创建电路