当前位置: 首页 > 知识库问答 >
问题:

Python中嵌套字典的二叉树

锺离俊雄
2023-03-14

在给定嵌套字典的情况下,如何构建二叉树?理想情况下,我希望访问根,然后以规则的深度优先或广度优先方式遍历树。

在从嵌套字典构建时间或空间方面的树时,我并不非常关心效率,所以我不介意在这个过程中使用额外的数据结构。我的主要关注点是一个全面而直观的解决方案。我现在不知道从哪里开始,所以非常感谢任何帮助。

class Vertex:
    """Vertex object in a binary tree."""

    def __init__(self):
        """Initialize Vertex object.

        Fields
        ----------
        value : int
            The value of node v
        left : None
            The left child of node v
        right : None
            The right child of node v
        """
        self.value = None
        self.left = None
        self.right = None


def dict_to_binary_tree(data):
    """Implementation here."""
    return root


if __name__ == '__main__':

    t = {
        "value": 1,
        "left": {
            "value": 2,
            "left": {
                "value": 3,
                "left": None,
                "right": None
            },
            "right": {
                "value": 4,
                "left": None,
                "right": None
            }
        },
        "right": {
            "value": 2,
            "left": {
                "value": 4,
                "left": None,
                "right": None
            },
            "right": {
                "value": 3,
                "left": None,
                "right": None
            }
        }
    }

    root = dict_to_binary_tree(t)

    # traverse tree i.e. dfs(root), bfs(root)

这是二叉树的样子:

    1
   / \
  2   2
 / \ / \
3  4 4  3

共有2个答案

万涵亮
2023-03-14

您应该使您的< code>Vertex构造函数更加通用,这样它就可以使用参数来初始化属性。

喜欢这个:

class Vertex:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

然后,您的函数可以是递归的,如下所示:

def dict_to_binary_tree(data):
    return data and Vertex(
            data["value"], 
            dict_to_binary_tree(data["left"]), 
            dict_to_binary_tree(data["right"])
        )

要进行简单的深度第一次迭代,请在Node类上定义__iter__

class Vertex:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def __iter__(self):
        yield self.value
        if self.left:
            yield from self.left
        if self.right:
            yield from self.right

现在,您的主代码可以执行此操作:

root = dict_to_binary_tree(t)
print(*root)  # will print values in depth-first, pre-order
单凯捷
2023-03-14

遍历字典的递归函数应该很好地完成这项工作:

def VertexFromDict(d):
    if not d: return None
    v       = Vertex()
    v.value = d['value']
    v.left  = VertexFromDict(d.get('left'))
    v.right = VertexFromDict(d.get('right'))
    return v

输出:

root = VertexFromDict(t)
printBTree(root,lambda v:(str(v.value),v.left,v.right))

      1
   __/ \_
  2      2
 / \    / \
3   4  4   3

注意:我用来打印树的printBTree函数可以在这里找到。

 类似资料:
  • 问题内容: 我在理解Python3中的嵌套字典理解时遇到了麻烦。从下面的示例中得到的结果输出的是正确的结构,没有错误,但仅包含一个内部键:值对。我还没有找到像这样的嵌套字典理解的例子。谷歌搜索“嵌套词典理解python”显示了遗留示例,非嵌套理解或使用其他方法解决的答案。我可能使用了错误的语法。 例: 此示例应返回原始字典,但内部值由修改。 outside_dict词典的结构以及结果: 问题答案:

  • 问题内容: 我正在处理一个复杂的嵌套字典和列表数据结构。我需要将数据展平并将所有嵌套项都置于0级。有关更多说明,请参见以下示例: 我需要将其展平为: 我从这篇文章的第一个答案中获得了参考,但是只有在我嵌套了字典的情况下它才可以工作,如果列表嵌套在字典中并且更多的词典嵌套在这些列表中,则它不能工作。 我对代码做了一些修改以适合我的用例,但是此代码不起作用 当我在此处粘贴代码时,缩进变得混乱。但我真的

  • 问题内容: 我有类似的东西 并且需要具有: 非常感谢! 编辑:我想按subkey1进行排序,这之前还不清楚。 问题答案: 使用关键字表示功能和方法: 演示: 假定 所有 顶级词典都具有一个键,该键被假定为带有键的字典。 有关更多详细信息和技巧,请参见Python Sorting HOWTO 。

  • 问题内容: 搜索一个值并获取父词典名称(键): 在以上字典中,我需要搜索类似的值:。其中,字典中没有任何值重复。如何搜索?因此它应该返回字典中的父键。 请注意 :解决方案应在 未修改的情况下 适用 于 Python 2.7和Python 3.3。 问题答案: 这是对嵌套dict的迭代遍历,还可以跟踪导致特定点的所有键。因此,一旦您在字典中找到正确的值,您就已经具有获取该值所需的键。 如果将以下代码

  • 我正在努力编写一本嵌套非常多的词典。只有当字典中有“name”:“bingo”时,我才需要获取字典的“main_id”。 我有解决办法,但在我看来是相当丑陋的。 我想知道: 有更好更干净的方法来实现它(总是;)

  • 问题内容: 我正在尝试将嵌套的字典写入.csv文件。这是一个简单的示例: 这使我得到一个包含两列的表:第一个包含; 第二个包含[2,1,1](或子词典中的相应值)。我想要一个有四列的表:一列对应的列表元素,然后三列对应的列表元素。 问题答案: 更改: 至: 否则,您会尝试向csv编写类似的内容,而您的意思是。 如Padraic所述,您可能希望更改为或避免随机行为。