相比 DFS 每個節點取深度 這題用這個方法更快
葉節點越多越慢
如果你是寫 python 或 Java 或者你想要這題更快的話 可以用這個做法
在測資時 把沒有子節點的節點紀錄下來 因為我們要從葉節點開始往上讀
以每個葉節點往上讀過各一遍 取H的最大值
例:
7
/
2
/ \
3 4
\
5
以這個圖來說 當我從3開始走時 2的高度是1 當我以5開始走時 2的高度是2 要取最大值 所以 2的高度是2
所有葉節點的終點即為根節點 第一部分解決
把 所有高度總和 第二部份解決
注意: 這題要迴圈 用遞迴 會因為呼叫太多次而錯誤
相比 DFS 每個節點取深度 這題用這個方法更快
葉節點越多越慢
如果你是寫 python 或 Java 或者你想要這題更快的話 可以用這個做法
在測資時 把沒有子節點的節點紀錄下來 因為我們要從葉節點開始往上讀
以每個葉節點往上讀過各一遍 取H的最大值
例:
7
/
2
/ \
3 4
\
5
以這個圖來說 當我從3開始走時 2的高度是1 當我以5開始走時 2的高度是2 要取最大值 所以 2的高度是2
所有葉節點的終點即為根節點 第一部分解決
把 所有高度總和 第二部份解決
注意: 這題要迴圈 用遞迴 會因為呼叫太多次而錯誤
我用這個方法寫
但8就TLE了
有人可以指出我哪裡多迴了嗎
還是說有更好的寫法?
相比 DFS 每個節點取深度 這題用這個方法更快
葉節點越多越慢
如果你是寫 python 或 Java 或者你想要這題更快的話 可以用這個做法
在測資時 把沒有子節點的節點紀錄下來 因為我們要從葉節點開始往上讀
以每個葉節點往上讀過各一遍 取H的最大值
例:
7
/
2
/ \
3 4
\
5
以這個圖來說 當我從3開始走時 2的高度是1 當我以5開始走時 2的高度是2 要取最大值 所以 2的高度是2
所有葉節點的終點即為根節點 第一部分解決
把 所有高度總和 第二部份解決
注意: 這題要迴圈 用遞迴 會因為呼叫太多次而錯誤
我用這個方法寫
但8就TLE了
有人可以指出我哪裡多迴了嗎
還是說有更好的寫法?node_num = int(input())
tree = [0 for _ in range(node_num)]leaves = []for i in range(node_num):temp = [int(n) for n in input().split()]if temp[0] == 0: leaves.append(i+1)else:for j in temp[1:]: tree[j-1] = i+1#print(tree)#print(leaves)root = tree.index(0)+1print(root)
height = [0 for _ in range(node_num)]for leaf in leaves:current_node = leafh = 1while current_node != root:current_node = tree[current_node-1]height[current_node-1] = max(h, height[current_node-1])h += 1print(sum(height))
我把leaves改成set
可以避免父節點有多個同樣高度子節點的情況