資料結構學習筆記-遞迴求解森林高度

zeta186012發表於2024-05-11

森林的高度遞迴求解

問題描述:設計演算法求解森林的高度

【演算法設計思想】

兩個函式,一個用於計算單個二叉樹的高度,另一個用於計算二叉樹森林(即一組二叉樹)的最大高度。下面是對兩個函式的詳細解釋:

1. treeHeight 函式

這個函式用於計算單個二叉樹的高度。二叉樹的高度定義為從根節點到最遠葉子節點的最長路徑上的邊數。函式的引數是指向二叉樹根節點的指標 root

函式的邏輯如下:

  • 如果 rootNULL(即空指標),表示當前節點為空,因此返回高度為0。
  • 如果 root 不為空,函式會遞迴地計算左子樹 root->lChild 和右子樹 root->rChild 的高度。
  • 透過比較左右子樹的高度,取較大的那個高度,並在其基礎上加1(因為還要包括當前節點),得到當前樹的高度。
  • 返回當前樹的高度。

2. forestHeight 函式

這個函式用於計算二叉樹森林的最大高度。二叉樹森林是一組二叉樹的集合,每棵樹由一個陣列 forest 表示,其中陣列的每個元素是一個指向二叉樹根節點的指標。引數 numTrees 表示森林中樹的數量。

函式的邏輯如下:

  • 初始化一個變數 maxHeight 為0,用於記錄遍歷過程中發現的最大高度。
  • 使用一個 for 迴圈遍歷森林中的每一棵樹。對於每棵樹,透過呼叫 treeHeight 函式計算其高度。
  • 將計算得到的高度與當前記錄的最大高度 maxHeight 進行比較,如果當前樹的高度更大,則更新 maxHeight
  • 在遍歷完所有樹後,返回記錄的最大高度 maxHeight

這段程式碼展示瞭如何透過遞迴和迭代的方式計算二叉樹及其森林的高度。在實際應用中,這種計算對於理解資料結構的複雜性和設計演算法非常重要。

【演算法描述】

// 定義二叉樹節點結構
typedef struct BiNode {
    char data;
    struct BiNode *lChild;
    struct BiNode *rChild;
} BiNode;

// 求解二叉樹的高度
int treeHeight(BiNode* root) {
    if (root == NULL)
        return 0;

    // 遞迴計算左右子樹的高度,並取最大值
    int leftHeight = treeHeight(root->lChild);
    int rightHeight = treeHeight(root->rChild);

    // 返回左右子樹高度的最大值加上當前節點的高度(1)
    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

// 求解森林的高度
int forestHeight(BiNode** forest, int numTrees) {
    int maxHeight = 0;

    // 遍歷每棵樹,求解其高度,並記錄最大高度
    for (int i = 0; i < numTrees; ++i) {
        int height = treeHeight(forest[i]);
        if (height > maxHeight) {
            maxHeight = height;
        }
    }

    return maxHeight;
}

相關文章