[資料結構] BST 的 construct & traversal
Problem :
BST為二元樹的一種,符合下面兩個條件 :
1. 所有在左子樹之 Node 之值一定不大於 Root 之值
2. 所有在右子樹之 Node 之值一定不小於 Root 之值
輸入數值為一串整數,數 字之間以空白隔開
請將輸入的 DATA 依序 Insert 以建立一個 BST
並依序輸出其 Inorder,Preorder,Postorder以及node總數
(請參考下面所附的測資及sample檔)
50 30 98 24 45 52 5 28 60 5 24 28 30 45 50 52 60 98 50 30 24 5 28 45 98 52 60 5 28 24 45 30 60 52 98 50 助教改作業時會以最後一版為準)Sample input:
Sample output:
繳交期限:
12/11/2012 23:59
超過期限者每多一天扣作業分數10%
超過12/15/2012 23:59後繳交一律不給分。
繳交格式:
一律將程式碼.c/.cpp檔案壓縮為.rar/.zip/.7z上傳至FTP
繳交檔案格式為
學號_HW3_Ver1.rar
ex:101522054_HW3_Ver1.rar
(在期限內如果想再重新上傳檔案則命名為ver2 ver3以此類推
這次程式沒有很難,但是我不確定我有沒有寫錯。 #include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <queue>
using namespace std;
struct BTnode{
BTnode *l, *r;
int num;
};
void insBT(BTnode **root, int num) {
if((*root) == NULL) {
(*root) = new BTnode;
(*root)->num = num;
(*root)->l = (*root)-> r = NULL;
return;
}
BTnode *idx, *p;
idx = (*root);
while(idx) {
if(idx->num > num) {
if(idx->l == NULL) {
p = new BTnode;
idx->l = p;
p->num = num;
p->l = p->r = NULL;
return;
}
idx = idx->l;
} else {
if(idx->r == NULL) {
p = new BTnode;
idx->r = p;
p->num = num;
p->l = p->r = NULL;
return;
}
idx = idx->r;
}
}
}
void preorder(BTnode *p) {
if(p == NULL) return;
printf("%-5d", p->num);
preorder(p->l);
preorder(p->r);
}
void inorder(BTnode *p) {
if(p == NULL) return;
inorder(p->l);
printf("%-5d", p->num);
inorder(p->r);
}
void postorder(BTnode *p) {
if(p == NULL) return;
postorder(p->l);
postorder(p->r);
printf("%-5d", p->num);
}
void levelorder(BTnode *p) {
queue<BTnode*> Q;
Q.push(p);
while(!Q.empty()) {
p = Q.front();
Q.pop();
printf("%-5d", p->num);
if(p->l)
Q.push(p->l);
if(p->r)
Q.push(p->r);
}
}
int cntNode(BTnode *p) {
if(p == NULL) return 0;
return cntNode(p->l)+cntNode(p->r)+1;
}
void freeBT(BTnode *p) {
if(p == NULL) return;
freeBT(p->l);
freeBT(p->r);
delete p;
}
int main() {
char line[1024];
BTnode *root = NULL;
int num;
printf("輸入數列 用空白隔開:");
gets(line);
stringstream sin(line);
while(sin >> num) {
insBT(&root, num);
}
printf("inorder: ");
inorder(root);
puts("");
printf("preorder: ");
preorder(root);
puts("");
printf("postorder: ");
postorder(root);
puts("");
printf("levelorder: ");
levelorder(root);
puts("");
printf("Node總數: %d\n", cntNode(root));
freeBT(root);
system("pause");
return 0;
}
上一篇:[演算法][程式作業] LCS
下一篇:[線性代數][作業] 旋轉矩陣