【问题标题】:Python - k-ary tree list-representation pre- and postorder traversalPython - k-ary 树列表表示前序和后序遍历
【发布时间】:2017-04-13 13:25:22
【问题描述】:

我正在为一棵树创建一个 python 类,其中每个节点都有 n 个子节点(但每个子节点只有一个节点)。我需要实现两种方法,预购和后购。我被困在预订中。

这是我目前所拥有的:

class KTree:
  def __init__(self, n, lst = []):
    self._tree = lst
    self._n = n

  def children(self, i):
    tree = self._tree
    n = self._n
    result = []
    for k in range(n*i+1, n*i+n+1):
        if k<len(tree):
            result.append(tree[k])
        else:
            pass
    return result

  def child_indices(self, i): 
    #returns list of the indices of the children of i
    tree=self._tree
    n = self._n
    result=[]
    for k in range(n*i+1, n*i+n+1):
        if k<len(tree):
            result.append(k)
    return result

  def parent(self, i):
    tree = self._tree
    n = self._n
    result = (i-1)//n
    return tree[result]

  def pre_order(self):
    result=[]
    stack = []
    stack.append(0)
    k=0
    while k<len(stack):
        result.append(self._tree[stack[k]])
        for index in self.child_indices(k):
            stack.append(index)
        k+=1
    return result

对于树[20, 2, 123, 1, 5, 4, 438](如下图,我认为preorder的输出应该是[20, 2, 1, 5, 123, 4, 438]。我目前的代码是输出[20, 2, 123, 1, 5, 40, 438]

     20
   /    \
  2     123
 / \    / \
1   5  4  438

【问题讨论】:

    标签: python tree traversal


    【解决方案1】:

    你可以使用递归。为此,您可以为您的函数定义一个参数:从哪里开始生成预购列表的索引。

    那么代码如下所示:

    def pre_order(self, k = 0):
        result = [self._tree[k]]
        for index in self.child_indices(k):
            result.extend(self.pre_order(index))
        return result
    

    这个的后序变体看起来非常相似,但是您仅在添加了子节点的后序列表之后添加给定节点:

    def post_order(self, k = 0):
        result = []
        for index in self.child_indices(k):
            result.extend(self.post_order(index))
        return result + [self._tree[k]]
    

    【讨论】:

    • 谢谢-我不知道如何实现递归,因为我没有想到将 k 添加为参数。天才!
    【解决方案2】:

    预购递归实现为

    检查当前节点是否为空/null。 显示根(或当前节点)的数据部分。 通过递归调用前序函数遍历左子树。 递归调用前序函数遍历右子树。

    这是来自维基百科。

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多