Python - k-ary树列表 - 表示前后遍历

时间:2017-04-13 01:35:49

标签: python tree traversal

我为树创建一个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](如下图所示,我认为预订的输出应为[20, 2, 1, 5, 123, 4, 438]。我当前的代码输出[20, 2, 123, 1, 5, 40, 438]

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

2 个答案:

答案 0 :(得分:0)

预订以递归方式实施

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

这是来自wikepedia。

答案 1 :(得分:0)

你可以使用递归。为了实现这一点,您可以为函数定义一个参数:从哪里开始生成预订单列表的索引。

然后代码如下:

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]]