返回列表 發帖

資料結構 203 二元搜尋樹建立與走訪(中)

二元搜尋樹建立與走訪
1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

2. 設計說明:
(1) 請撰寫一程式,首先要求使用者輸入正整數 N(1 ≤ N ≤ 30),代表有 N 個節點資料,接著依序輸入 N 個節點資料。每一節點資料是一個正整數數字,且整數間以半形空白間隔。

(2) 請將這些節點建構「二元搜尋樹(Binary Search Tree)」,並將此二元樹分別以「階層(Level-Order)走訪」與「前序(Preorder)走訪」順序輸出數列。

提示:輸出文字中「:」為半形字

3. 輸入輸出:
輸入說明
第 1 列:輸入正整數 N(1 ≤ N ≤ 30)為資料個數。
第 2 列:依序輸入 N 個不重複的正整數,整數間以半形空白間隔。

輸出說明
第 1 列:階層走訪結果,整數間以半形空白間隔。
第 2 列:前序走訪結果,整數間以半形空白間隔。

範例輸入1
5
7 9 2 5 10
範例輸出1
Level-order:7 2 9 5 10
Preorder:7 2 5 9 10
範例輸入2
8
25 31 5 9 18 26 51 99
範例輸出2
Level-order:25 5 31 9 26 51 18 99
Preorder:25 5 9 18 31 26 51 99
May

回復 1# may
//#include <iostream>
//#include <queue>
#include <bits/stdc++.h>
using namespace std;

// 節點結構
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 插入節點到 BST
TreeNode* insert(TreeNode* root, int val) {
    if (!root) return new TreeNode(val);
    if (val < root->val)
        root->left = insert(root->left, val);
    else
        root->right = insert(root->right, val);
    return root;
}

// 階層(Level-Order)走訪
void levelOrder(TreeNode* root) {
    if (!root) return;
    queue<TreeNode*> q;
    q.push(root);
    cout << "Level-order:";
    bool first = true;
    while (!q.empty()) {
        TreeNode* node = q.front();
        q.pop();
        if (first) {
            cout << node->val;
            first = false;
        } else {
            cout << " " << node->val;
        }
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
    cout << endl;
}

// 前序(Preorder)走訪
void preorder(TreeNode* root, bool isFirst) {
    if (!root) return;
    if (isFirst)
        cout << root->val;
    else
        cout << " " << root->val;
    preorder(root->left, false);
    preorder(root->right, false);
}

int main() {
    int N;
    cin >> N;
    TreeNode* root = nullptr;
    for (int i = 0; i < N; ++i) {
        int val;
        cin >> val;
        root = insert(root, val);
    }
   
    levelOrder(root);
    cout << "Preorder:";
    preorder(root, true);
    cout << endl;
   
    return 0;
}
---------------------------------------------------------------
程式碼說明:
節點結構 (TreeNode):

定義一個 TreeNode 結構,包含 val(節點值)、left(左子樹)和 right(右子樹)。

插入節點 (insert):

遞迴插入節點到 BST,若 val 小於根節點,則插入左子樹,否則插入右子樹。

階層走訪 (levelOrder):

使用 queue 來進行 BFS(廣度優先搜尋)。

逐層輸出節點值。

前序走訪 (preorder):

遞迴方式,按照「根 -> 左 -> 右」順序輸出節點值。

主程式 (main):

讀取輸入數值並建立 BST。

執行階層走訪和前序走訪,並輸出結果。

這段程式碼可正確建立 BST 並依題目要求輸出走訪順序。
---------------------------------------------
測資:
測試資料00:
輸入:
5
7 9 2 5 10
預期輸出:
Level-order:7 2 9 5 10
Preorder:7 2 5 9 10
測試資料 01:
輸入:
8
25 31 5 9 18 26 51 99
預期輸出:
Level-order:25 5 31 9 26 51 18 99
Preorder:25 5 9 18 31 26 51 99
測試資料 02:
輸入:
6
50 30 70 20 40 60
預期輸出:
Level-order:50 30 70 20 40 60
Preorder:50 30 20 40 70 60
測試資料 03:
輸入:
7
15 10 20 8 12 17 25
預期輸出:
Level-order:15 10 20 8 12 17 25
Preorder:15 10 8 12 20 17 25
測試資料 04:
輸入:
10
45 30 60 20 35 50 70 10 25 40
預期輸出:
Level-order:45 30 60 20 35 50 70 10 25 40
Preorder:45 30 20 10 25 35 40 60 50 70
這些測試資料涵蓋了不同的樹形結構,包括左右子樹的不同排列,確保程式能正確處理各種情況!
May

TOP

返回列表