水平)1068ツリー




コード#コード#

n = int(input())

li = list(map(int, input().split()))
r = int(input())

tree = [[]for _ in range(n)]
root = 0
ans = 0

for idx, i in enumerate(li):
    if i == -1:
        root = idx
        continue
    if idx == r:
        continue
    tree[i].append(idx)


def dfs(v):
    global ans
    if len(tree[v]) ==0:
        ans += 1
        return
    for i in tree[v]:
        dfs(i)

if root != r:
    dfs(root)
print(ans)


方法

  • ツリーを実現します.
  • は当初、親に与えることを明確に規定していたので、双方向に貯蔵する必要はなかった.
  • 各親は、自分の子供を保存しますが、削除するノードは追加されません.
  • の後に木の上を巡回して、サブノードのない子供なら、答えを1つ増やせばいいです.
  • 持ち物

  • の親ノードを提供する場合、双方向のストレージは必要ありません.
  • したがって、
  • はアクセスノードの配列を格納する必要もない.
  • ですが、条件をよく考えるべきだと思います.