NTOU CSE C++ Programming
教學文件和作業說明文件: https://hackmd.io/@kogiokka/ntou-cse-cpp-nav
範例程式和範例專案:Google Drive
撰寫二元樹(binary search tree)程式來儲存各式的資料,並練習 C++ 語法:structure、pointer、reference 和 template。
程式範例:binary-tree.cpp
<學號>-<姓名>.zip
,例如:11057666-陳小明.zip
。int
、float
利用 template 的語法撰寫二元樹,儲存資料型態為 int
或 float
。
必須使用下面結構
template<typename T>
struct TreeNode
{
T data;
struct TreeNode* left;
struct TreeNode* right;
};
程式包含下列函式以及函式模板:
/**
* 比較兩個數值的大小。
*
* @param a 數值一
* @param b 數值二
* @return 0 代表兩個數值相等;<0 代表 a 小於 b;>0 代表 a 大於 b。
*/
int compare(int a, int b); // 比較int資料大小
int compare(float a, float b); // 比較float資料大小
/**
* 印出數值。
*
* @param a 想要印出的數值
*/
void print(int a);
void print(float a);
/**
* 新增一個值到指定的樹或子樹中
*
* @param root 樹或子樹的根
* @param value 欲插入的值
*/
template<typename T>
void insertNode(TreeNode<T>*& root, T value);
/**
* 中序走訪(In-order Traversal)
*
* @param root 樹或子樹的根
*/
template<typename T>
void inOrder(TreeNode<T>* root);
/**
* 前序走訪(Pre-order Traversal)
*
* @param root 樹或子樹的根
*/
template<typename T>
void preOrder(TreeNode<T>* root);
/**
* 後序走訪(Post-order Traversal)
*
* @param root 樹或子樹的根
*/
template<typename T>
void postOrder(TreeNode<T>* root);
利用template語法撰寫的二元樹(binary search tree)來儲存書籍資料。書籍資料必須使用下面結構:
struct Book
{
char* bookName; // 書名當成 key 來比較大小
char* authors;
int price;
};
Hint:每一種資料型別都有專門用於該型別的比大小函式。
// Use reference to avoid copying
int compare(const Book& book1, const Book& book2) { /* TODO */ }
inline void print(const Book& book) { /* TODO */ }
書籍資料範例:
名稱 | 作者 | 價格 |
---|---|---|
"精通光學辨識技術:應用ABBYY FineReader 11 OCR" | "黃敦義" | 371 |
"VISUAL FORTRAN程式設計與開發" | "張嘉強、陳鴻智" | 400 |
"程式設計-使用C++" | "黃建庭" | 420 |
"資料庫系統-MTA認證影音教學" | "李春雄" | 336 |
"輕鬆搞定Google雲端技術:Maps.Android.App Engine.Cloud SQL與電子商務API實例解析" | "陳世興" | 560 |
"人工智慧:智慧型系統導論(第三版) " | "李聯旺 廖珗洲 謝政勳" | 590 |
"電腦網路概論(第二版)" | "陳雲龍" | 420 |
"網際網路與電子商務(第三版)" | "朱正忠" | 450 |
"資料庫系統理論-使用SQL Server 2008" | "李春雄" | 650 |
"動畫圖解資料庫系統理論-使用Access 2010實作(第二版) " | "李春雄" | 600 |
/**
* 在二元樹中搜尋指定的資料,並刪除該節點。
*
* @param root 二元樹的樹根指標
* @param key 要刪除的資料的key
* @return 成功或失敗
*/
template<typename T, typename K>
int deleteNode(TreeNode<T>*& root, K key) { /* TODO */ }