2024年11月27日 星期三

tree list 實作版

 # 樹結構定義 (-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}')

沒有留言:

張貼留言