Python树遍历并排序排序列表中的项目组

时间:2017-10-09 20:50:38

标签: python algorithm sorting data-structures tree

我正在遍历非二叉树,我有一个函数来计算节点的高度和子节点数。我想要做的是先按高度对节点的子节点进行排序,并在每个高度组内部按照子节点数对其进行排序

例如:

      a
   /     \
  b       c
 /|\     /
d e f   g
       /
      h

所以当我遍历树时:

def orderTree(node):        
   if "children" in node:
        if node['children']:
            node['children'].sort(key=findHeight)
            node['children'].sort(key=countChildren)

            for child in node['children']:
                print(child['name'])
                orderTree(child)

使用此代码我去=> A,C,G,H,B,d,E,F 但我需要的是=> A,B,d,E,F,C,G,H

任何想法如何在python列表中对已排序的项目组进行排序?

2 个答案:

答案 0 :(得分:0)

您所追求的树遍历类型称为预订。在不了解完整结构的情况下很难理解您的代码。但看起来你先是从根节点看孩子然后再往下走。

我认为您想打开第一个子节点,然后继续遍历。对于预订,它应该是类似的。

echo $_POST['module_title'];
var_dump($_FILES['file']);
var_dump($_FILES['file1'])
$filename = $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'],'uploads/'.$filename);

这是一个很好的参考 http://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/

答案 1 :(得分:0)

您想要做的是“多字段排序”,

要按节点高度排序节点列表,然后按子节点数量排序,只需将sort以下函数作为key

lambda x : (findHeight(x), children(x))

这只返回(height,children)元组。然后sort使用此元组来比较两个节点。

代码:

def orderTree(node):
   # I combined the two ifs
   if "children" in node and node['children']:
        node['children'].sort(key= lambda x : (findHeight(x), children(x) ) )

        for child in node['children']:
            print(child['name'])
            orderTree(child)

让我说我有  A = (a,b)B = (x, y)

这两个元组将如下进行比较:

def compare_tuple(A, B):
    if A[0] != B[0]: return A[0] < B[0]
    else: return A[1] < B[1]