阿摩線上測驗 登入

申論題資訊

試卷:108年 - 108 專技高考_資訊技師:程式設計#80792
科目:程式設計
年份:108年
排序:0

申論題內容

三、假設有一個用指標建立的二元樹,然後以 Pre-order, In-order, Post-order 及 Level-order tree traversal 的順序把字元列印出來,請用 C++或 Java 撰寫一完整的程式,分別寫出這 4 種 Tree traversal 的函式。(24 分)可以自訂一個字元二元樹如圖,並且列印出如下的結果,請寫出需要的 class及主程式。(6 分)5ddf1df2cb7f9.jpg5ddf1e29311f7.jpg

詳解 (共 1 筆)

詳解 提供者:hchungw
從定義二元樹節點開始:

#include <iostream>
#include <queue>
// Node definition
struct Node {
    char data;
    Node* left;
    Node* right;
    Node(char data) : data(data), left(nullptr), right(nullptr) {}
};
// Binary tree class
class BinaryTree {
public:
    Node* root;
    BinaryTree() : root(nullptr) {}
    // Pre-order traversal
    void preOrder(Node* node) {
        if (node == nullptr) return;
        std::cout << node->data << " ";
        preOrder(node->left);
        preOrder(node->right);
    }
    // In-order traversal
    void inOrder(Node* node) {
        if (node == nullptr) return;
        inOrder(node->left);
        std::cout << node->data << " ";
        inOrder(node->right);
    }
    // Post-order traversal
    void postOrder(Node* node) {
        if (node == nullptr) return;
        postOrder(node->left);
        postOrder(node->right);
        std::cout << node->data << " ";
    }
    // Level-order traversal
    void levelOrder(Node* node) {
        if (node == nullptr) return;
        std::queue<Node*> queue;
        queue.push(node);
        
        while (!queue.empty()) {
            Node* current = queue.front();
            queue.pop();
            std::cout << current->data << " ";
            if (current->left != nullptr) queue.push(current->left);
            if (current->right != nullptr) queue.push(current->right);
        }
    }
};
int main() {
    // Construct the tree as per the diagram
    BinaryTree tree;
    tree.root = new Node('A');
    tree.root->left = new Node('B');
    tree.root->right = new Node('C');
    tree.root->left->left = new Node('D');
    tree.root->left->right = new Node('E');
    tree.root->right->left = new Node('F');
    tree.root->left->left->left = new Node('G');
    tree.root->left->left->right = new Node('H');
    tree.root->right->left->right = new Node('I');
    // Perform the traversals
    std::cout << "Preorder: ";
    tree.preOrder(tree.root);
    std::cout << std::endl;
    std::cout << "Inorder: ";
    tree.inOrder(tree.root);
    std::cout << std::endl;
    std::cout << "Postorder: ";
    tree.postOrder(tree.root);
    std::cout << std::endl;
    std::cout << "Levelorder: ";
    tree.levelOrder(tree.root);
    std::cout << std::endl;
    return 0;
}
這段代碼創建了一個簡單的二元樹,並使用你提供的圖表填充它。然後,它分別以 pre-order、in-order、post-order 和 level-order 順序遍歷樹。每個遍歷函數都是二元樹類的成員函數,它們遞歸地處理樹的節點,直到達到 nullptr。遍歷結果將按照題目要求的順序輸出。