坏树设计,数据结构

Bad Tree design, Data Structure

我尝试制作一棵树作为我的数据结构课程的一部分。该代码有效但速度极慢,几乎是课程接受时间的两倍。我没有数据结构和算法方面的经验,但我需要优化程序。如果有人有任何提示、建议、批评,我将不胜感激。

树不一定是二叉树。

代码如下:

import sys
import threading

class Node:
    def __init__(self,value):
        self.value = value
        self.children = []
        self.parent = None
    def add_child(self,child):
        child.parent = self
        self.children.append(child)

def compute_height(n, parents):
    found = False
    indices = []
    for i in range(n):
        indices.append(i)
    for i in range(len(parents)):
        currentItem = parents[i]
        if currentItem == -1:
            root = Node(parents[i])
            startingIndex = i
            found = True
            break
    if found == False:
        root = Node(parents[0])
        startingIndex = 0
    return recursion(startingIndex,root,indices,parents)


def recursion(index,toWhomAdd,indexes,values):
    children = []
    for i in range(len(values)):
        if index == values[i]:
            children.append(indexes[i])
            newNode = Node(indexes[i])
            toWhomAdd.add_child(newNode)

            recursion(i, newNode, indexes, values)
        


    return toWhomAdd


def checkHeight(node):
    if node == '' or node == None or node == []:
        return 0
    counter = []
    for i in node.children:
        counter.append(checkHeight(i))
    if node.children != []:
        mostChildren = max(counter)
    else:
        mostChildren = 0
    return(1 + mostChildren)

def main():
    n = int(int(input()))
    parents = list(map(int, input().split()))
    
    root = compute_height(n, parents)
    print(checkHeight(root))
sys.setrecursionlimit(10**7)  # max depth of recursion
threading.stack_size(2**27)   # new thread will get stack of such size
threading.Thread(target=main).start()

编辑:

对于这个输入(第一个数字是节点的数量,其他数字是节点的值)

5
4 -1 4 1 1

我们期望这个输出(树的高度)

3

另一个例子:

输入:

5
-1 0 4 0 3

输出:

4

它看起来像为节点指定的 value 是另一个节点(其父节点)的索引引用。问题中没有说明这一点,但是如果该假设是正确的,那么您实际上并不需要使用 Node 个实例创建树。只需将输入读入列表(你已经这样做了),你实际上 编码在其中的树。

例如,列表 [4, -1, 4, 1, 1] 表示这棵树,其中标签是此列表中的索引:

                      1
                     / \
                    4   3
                   / \
                  0   2

根据维基百科给出的定义,这棵树的 height 应该是 2。但显然预期结果是 3,这是最长路径上的节点数(不是边数)叶子的根,或者 - 换句话说 - 树中级别的数量。

用递归的思路是对的,但是可以自下而上(从任意节点开始),递归得到父节点的结果,将1加1。利用动态规划的原理,存储每个节点的结果在一个单独的列表中,我称之为 levels:

def get_num_levels(parents):
    levels = [0] * len(parents)

    def recur(node):
        if levels[node] == 0:  # this node's level hasn't been determined yet
            parent = parents[node]
            levels[node] = 1 if parent == -1 else recur(parent) + 1
        return levels[node]

    for node in range(len(parents)):
        recur(node)

    return max(levels)

主要代码可以是你所拥有的:

def main():
    n = int(int(input()))
    parents = list(map(int, input().split()))
    
    print(get_num_levels(parents))