繁体   English   中英

遍历非二叉树

[英]Traversing a non-binary tree

我为节点制作了自定义类

class NodeTree(object):
    def __init__(self, name = None, children = None):
        self.name = name
        self.children = children

并定义了一个函数来生成树(包含其子节点的节点)

def create_tree(d):
    x = NodeTree()
    for a in d.keys():
        if type(d[a]) == str:
            x.name = d[a]
        if type(d[a]) == list:
            if d[a] != []:
                for b in d[a]:
                    x.add_child(create_tree(b))
    return x

输入是一个字典,其中有一个用于节点名的参数,以及一个列表,其子节点的形式与父节点相同。 该函数工作正常,我已经提出了证明它的方法,但是我找不到找到正确遍历并获得树高的方法。 我不知道“高度”是否是正确的术语,因为我知道这可能是矛盾的,因此我需要将节点计为度量单位,如下所示:

                                      parent
                                         |
                                         |
                                     ---------
                                     |       |
                                    child   child

这棵树的高度是2,我已经尝试了所有方法,从类中的计数器到标记,一切似乎都退化了,但我从来没有得到正确的高度。 我应该如何处理?

要为您的树创建确定节点高度(即从该节点到叶子的路径中最大节点数)的递归height方法:

def height(self):
    if not self.children:  # base case
        return 1
    else:                  # recursive case
        return 1 + max(child.height() for child in self.children)

其他树遍历也可以递归进行。 例如,这是一个生成器方法,该方法以“预定”的方式生成树节点的名称(即,每个父级在其子级和后代之前):

def preorder(self):
    yield self.name
    for child in self.children:
        yield from child.preorder() # Python 3.3 only!

该循环中语法的yield from在Python 3.3中是新的。 您可以通过以下方式在早期版本中获得相同的结果:

        for descendent in child.preorder():
            yield descendent

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM