資料結構學習筆記-先序遍歷森林

zeta186012發表於2024-05-12

先序遍歷森林

問題描述:設計演算法輸出先序遍歷的森林節點及其所在的層次

【演算法設計思想】

1. 資料結構定義

首先,定義二叉樹節點的資料結構。每個節點包含儲存資料的data欄位,以及指向左右子節點的指標(lChildrChild)。這種資料結構是二叉樹和森林表示的基礎。

2. 先序遍歷單棵樹

設計一個遞迴函式preorderTraversal用於先序遍歷單棵樹。先序遍歷的順序是:先訪問根節點,然後遞迴遍歷左子樹,最後遞迴遍歷右子樹。在訪問每個節點時,輸出該節點的資料和層次資訊。層次資訊是透過遞迴呼叫時增加的層次引數level來維護的。

3. 遍歷森林

森林可以視為二叉樹的陣列。設計一個函式preorderTraversalForest,它接受表示森林的二叉樹陣列和陣列的大小。對於陣列中的每棵樹,使用preorderTraversal函式進行先序遍歷,並在每棵樹的遍歷開始前列印一個標識該樹的訊息,以區分不同的樹。

4. 層次資訊傳遞

在遍歷過程中,透過遞迴函式的引數傳遞當前節點的層次資訊。每當遞迴進入新的一層(即向下遍歷到子節點時),層次引數level增加1。這樣,可以確保每個節點的層次資訊準確無誤地被計算和輸出。

【演算法描述】

void preorderTraversalForest(BiNode** forest, int size) {
    for (int i = 0; i < size; i++) {
        printf("Tree %d:\n", i + 1);
        preorderTraversal(forest[i], 1); // 根節點層次為 1
        printf("\n");
    }
}

【測試程式】

#include <stdio.h>
#include <stdlib.h>

typedef struct BiNode {
    char data;
    struct BiNode* lChild;
    struct BiNode* rChild;
} BiNode, *BiTree;

void preorderTraversal(BiNode* root, int level) {
    if (root == NULL)
        return;
    
    printf("Node: %c, Level: %d\n", root->data, level);
    preorderTraversal(root->lChild, level + 1);
    preorderTraversal(root->rChild, level + 1);
}

void preorderTraversalForest(BiNode** forest, int size) {
    for (int i = 0; i < size; i++) {
        printf("Tree %d:\n", i + 1);
        preorderTraversal(forest[i], 1); // 根節點層次為 1
        printf("\n");
    }
}

BiNode* createNode(char data) {
    BiNode* newNode = (BiNode*)malloc(sizeof(BiNode));
    newNode->data = data;
    newNode->lChild = NULL;
    newNode->rChild = NULL;
    return newNode;
}

int main() {
    // 建立森林,包含兩棵樹
    BiNode* forest[2];

    // 建立第一棵樹
    //      A
    //     / \
    //    B   C
    BiNode* tree1 = createNode('A');
    tree1->lChild = createNode('B');
    tree1->rChild = createNode('C');

    // 建立第二棵樹
    //      D
    //       \
    //        E
    BiNode* tree2 = createNode('D');
    tree2->rChild = createNode('E');

    forest[0] = tree1;
    forest[1] = tree2;

    // 遍歷森林
    preorderTraversalForest(forest, 2);

    // 釋放分配的記憶體
    free(tree1->lChild);
    free(tree1->rChild);
    free(tree1);
    free(tree2->rChild);
    free(tree2);

    return 0;
}

相關文章