# 樹結構定義 (-1 表示無子節點)
tree = [[1, 2], [3, -1], [5, 6], [-1, -1], [-1, -1], [-1, -1], [-1, -1]]
# 輸出樹的詳細結構
def detail():
print("Tree Details:")
for i, node in enumerate(tree):
left = node[0] if node[0] != -1 else "None"
right = node[1] if node[1] != -1 else "None"
print(f'node {i} : left: {left}, right: {right}')
# 先序遍歷 (遞迴方式)
def preorder(node):
if node == -1 or node >= len(tree): # 當節點無效或超出範圍時返回
return
print(node, end=' ') # 輸出當前節點
preorder(tree[node][0]) # 遍歷左子樹
preorder(tree[node][1]) # 遍歷右子樹
# 中序遍歷
def inorder(node):
if node == -1 or node >= len(tree): # 當節點無效或超出範圍時返回
return
inorder(tree[node][0]) # 遍歷左子樹
print(node, end=' ') # 輸出當前節點
inorder(tree[node][1]) # 遍歷右子樹
# 後序遍歷
def postorder(node):
if node == -1 or node >= len(tree): # 當節點無效或超出範圍時返回
return
postorder(tree[node][0]) # 遍歷左子樹
postorder(tree[node][1]) # 遍歷右子樹
print(node, end=' ') # 輸出當前節點
# 找到所有葉子節點及其深度
def find_leaves_with_depth(node, depth, leaves):
if node == -1 or node >= len(tree): # 當節點無效或超出範圍時返回
return
# 如果當前節點的左、右子節點都是 -1,則它是葉子節點
if tree[node][0] == -1 and tree[node][1] == -1:
leaves.append((node, depth)) # 紀錄葉子節點和其深度
else:
# 遞迴檢查左子樹和右子樹,深度加 1
find_leaves_with_depth(tree[node][0], depth + 1, leaves)
find_leaves_with_depth(tree[node][1], depth + 1, leaves)
# 主程式
detail() # 顯示樹的結構
print("\nPreorder Traversal:")
preorder(0) # 從根節點開始
print("\n\nInorder Traversal:")
inorder(0) # 從根節點開始
print("\n\nPostorder Traversal:")
postorder(0) # 從根節點開始
# 找到葉子節點及其深度
leaves_with_depth = []
find_leaves_with_depth(0, 0, leaves_with_depth)
print("\n\nLeaves with Depths:")
for leaf, depth in leaves_with_depth:
print(f'Leaf {leaf} at Depth {depth}')
沒有留言:
張貼留言