#12310: C++ 解法


Sean64 (Sean @ https://sean.cat/)

學校 : 國立交通大學
編號 : 59159
來源 : [115.43.172.56]
最後登入時間 :
2024-08-29 01:27:52
d526. Binary Search Tree (BST) | From: [114.34.119.217] | 發表日期 : 2017-07-01 21:30

參考 The C Programming Language 內做法,並加上註解

#include <stdlib.h>
#include <iostream>

using namespace std;

typedef struct node *Nodeptr;
typedef struct node {
    int val;   // 此節點的值
    Nodeptr left;   // 左節點
    Nodeptr right;   // 右節點
} Node;   // 直接用 Node 代替 struct node

Node *addtree(Node *tree, int val);
void preorder(Node *tree);
Node *talloc(void);

int main() {
    int n, m;
    while (cin >> n) {   // 數量
        Node *root = NULL;   // 空樹
        for (int i=0; i<n; i++) {
            cin >> m;   // 各節點值
            root = addtree(root, m);   // 插入 m
        }
        preorder(root);   // 呼叫 preorder 函式,印出 Binary Tree
        cout << endl;   // 消失的換行
    }
    return 0;
}

Node *addtree(Node *tree, int val) {   // 插入 val 至 tree
    if (tree == NULL) {   // 這個節點沒東西
        tree = talloc();   // 挪個空間給他
        tree->val = val;   // 就決定是你了!
        tree->left = NULL;   // 定義為空
        tree->right = NULL;
    } else if (val < tree->val)   // 比節點小
        tree->left = addtree(tree->left, val);   // 遞歸呼叫此函式,並以回傳值取代左節點
    else
        tree->right = addtree(tree->right, val);
    return tree;   // 回傳新的 binary tree
}

void preorder(Node *tree) {   // 以 Pre-Order 列出 Binary Tree
    if (!tree)   // 這節點沒東西了
        return;
    printf("%d ", tree->val);   // 中
    preorder(tree->left);   // 左
    preorder(tree->right);   // 右
}

Node *talloc(void) {   // 配置 Node 空間
    return (Node *) malloc(sizeof(struct node));   // 呼叫 malloc (Memory Allocate) 配置適合 Node 的記憶體大小,並轉換為 "Node *" 型態
}
 
ZeroJudge Forum