P-8-1. 樹上的推銷員
```python=
def dfs(v,p,tour): # visit v, parent p
tour.append(v) # first arrive v
for u in adj[v]:
if u == p: continue
dfs(u,v,tour) # visit u
tour.append(v) # back to v
return
#
n = int(input())
adj = [[] for i in range(n)]
total = 0
for i in range(n-1):
u,v,w = [int(x) for x in input().split()]
total += w
adj[u].append(v)
adj[v].append(u)
# sort adj
for i in range(n):
adj[i].sort()
tour = []
dfs(0,-1,tour)
print(total*2)
print(*tour)
```
P-8-2. 物流派送系統
```python=
#這是我自己寫的 算是暴力解 沒有繼承前一個點的狀態
n = int(input())
adj = [[] for i in range(n)]
c = [0 for i in range(n)]
for i in range(1,n):
a,b = map(int,input().split())
adj[i].append(a)
c[i] = b
def dfs(s):
ans = 0
for i in adj[s]:
c[s] += c[i]
ans = max(ans,1 +dfs(i))
return ans
ma = -1
for i in range(n):
ma = max(dfs(i),ma)
print(max(c))
print(ma)
```
```python=
#解答有優化 繼承前一個點的狀態
def dfs(v):
global d,step
for u in child[v]:
d[u] = d[v] + leng[u]
step[u] = step[v] + 1
dfs(u)
n = int(input())
child = [[] for i in range(n)]
leng = [0]*n
for i in range(1,n):
v,w = [int(x) for x in input().split()]
child[v].append(i)
leng[i] = w # length of edge (parent[i],i)
d = [0]*n
step = [0]*n
dfs(0)
print(max(d))
print(max(step))
```
112選手題R樹的直徑
```python=
def dfs(v, parent):
max_depth = 0
for i in adj[v]:
if i != parent:
max_depth = max(max_depth, dfs(i, v) + 1)
return max_depth
n = int(input())
adj = [[] for _ in range(n + 1)]
for i in range(n - 1):
a, b = map(int, input().split())
adj[a].append(b)
adj[b].append(a)
ma = 0
fnode = 0
for i in range(1, n + 1):
distance = dfs(i, -1)
if distance > ma:
ma = distance
fnode = i
print(ma)
```
樹的遍歷
```python=
class TreeNode:
def __init__(self, val: int):
self.val: int = val
self.left = None
self.right= None
n1 = TreeNode(val=1)
n2 = TreeNode(val=2)
n3 = TreeNode(val=3)
n4 = TreeNode(val=4)
n5 = TreeNode(val=5)
n6 = TreeNode(val=6)
n7 = TreeNode(val=7)
n1.left = n2
n1.right = n3
n2.left = n4
n2.right = n5
n3.left = n6
n3.right = n7
def forward(node: TreeNode):#前序遍歷
if node is None:
return []
return [node.val] + forward(node.left) + forward(node.right)
print(forward(n1))
#[1, 2, 4, 5, 3, 6, 7]
def mid(node: TreeNode):#中序遍歷
if node is None:
return []
return mid(node.left) + [node.val] + mid(node.right)
print(mid(n1))
#[4, 2, 5, 1, 6, 3, 7]
def back(node: TreeNode):#後序遍歷
if node is None:
return []
return back(node.left) + back(node.right) + [node.val]
print(back(n1))
#[4, 5, 2, 6, 7, 3, 1]
```
二元樹資訊
```python=
n = int(input())
adj = [[] for i in range(n)]
adj2 = [[] for i in range(n)]
for i in range(n):
p, l, r = map(int, input().split())
adj[p].append(l)
adj[p].append(r)
if l != -1:
adj2[l].append(p)
if r != -1:
adj2[r].append(p)
def parent(n):
for i in range(len(adj)):
if len(adj[i]) >= 2:
if adj[i][0] == n or adj[i][1] == n:
return i
return -1
def degree(n):
ans = 0
for i in adj[n]:
if i != -1:
ans += 1
return ans
def depth(n, ans):
if not adj2[n]:
return ans
return depth(adj2[n][0], ans + 1)
def height(n):
if n == -1:
return 0
if adj[n][0] != -1:
lh = height(adj[n][0])
else:
lh = 0
if adj[n][1] != -1:
rh = height(adj[n][1])
else:
rh = 0
return max(lh, rh) + 1
for i in range(n):
print(f"node {i}: parent = {parent(i)}, degree = {degree(i)}, depth = {depth(i, 0)}, height = {height(i)-1},")
```
P-8-4. 樹的高度與根 (同P-3-1) (APCS201710)
```python=
n = int(input())
adj = [[] for _ in range(n+1)]
bol = [1] + [0 for i in range(n)]
for i in range(n):
z = [int(x) for x in input().split()]
for j in range(1, len(z)):
adj[i+1].append(z[j])
bol[z[j]] = 1
def dfs(v):
ma = 0
for i in adj[v]:
ma = max(ma,dfs(i)+1)
return ma
print(bol.index(0))
ans = 0
for i in range(n):
ans += dfs(i)
print(ans)
```
技藝商科111PP-二元樹
```python=
def build(preorder, inorder):
if not preorder or not inorder:
return []
root = preorder[0]
root_index = inorder.index(root)
left = inorder[:root_index]#中序的左子樹
right = inorder[root_index + 1:]#中序的右子樹
lp = preorder[1 :1 + len(left)]#前序的左子樹
rp = preorder[1 + len(left):]#前序的右子樹
left_postorder = build(lp, left)
right_postorder = build(rp, right)
return left_postorder + right_postorder + [root]
try:
while True:
preorder,inorder = map(str,input().split())
postorder = build(preorder, inorder)
print(''.join(postorder))
except EOFError:
pass
```