先序遍歷森林
問題描述:設計演算法輸出先序遍歷的森林節點及其所在的層次
【演算法設計思想】
1. 資料結構定義
首先,定義二叉樹節點的資料結構。每個節點包含儲存資料的data
欄位,以及指向左右子節點的指標(lChild
和rChild
)。這種資料結構是二叉樹和森林表示的基礎。
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;
}