今天開通新的博客,既然是一個新的程序員,那就寫一些與我的專業相關的東西吧,由於初學c語言,所以很多的東西不懂,網上的很多教程是壓根不能運行的,所以我想把自己學到的記錄下來並且進行分享,希望大家可以喜歡。
先把題目發一下吧,希望我們的TA不會介意。
題目大意:請完成下面四個函數的定義(在tree.h文件中),使整個程序能夠利用排序二叉樹的結構對輸入的數(不會出現相同的數),進行排序輸出。節點的結構體在下面已給出,這個二叉樹的特徵是,左子數的值肯定比父節點小,右子樹的值肯定比父節點的大。要求大家按照這個結構特徵去構建二叉樹,最後中序遍歷輸出就是我們要求的升序輸出。
樹的節點結構體爲:
typedef struct Node {
struct Node *left;
struct Node *right;
int value;
} Node;
中序遍歷這個二叉樹,按照升序輸出,每個數之間有一個空格,最後一個數後也有一個空格。
void traverse_tree_inorder(Node *p);
回收建立二叉樹時開闢的內存空間,提示類似後序遍歷。
void recycle_nodes(Node *p);
將一個值爲value的數插入到這個樹中,但是要注意,需要插到那個地方,按照排序二叉樹的要求來。
void insert_node(Node *p, int value);
初始化根節點的值。
Node* init_root(int value);
輸入示例:
5
23 3 53 333 2
輸出示例:
2 3 23 53 333 (最後一個數後有空格)
好的,先吐槽一下上課一不小心沒寫完,結果華麗麗的80分掛在上面(雖然全部都是對的)。不說了,下面是我的代碼(編譯通過了哦)。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node { //先定義這個結構體
struct Node *left;
struct Node *right;
int value;
} Node;
void traverse_tree_inorder(Node *p) { //中序遍歷,題目要求嘛。
if (p != NULL) { //遞歸完成,既先遍歷左子樹,後訪問根節點,再遍歷右子樹
traverse_tree_inorder(p->left);
printf("%d ", p->value);
traverse_tree_inorder(p->right);
}
}
void recycle_nodes(Node *p) { //釋放內存,既通過後序遍歷,因爲如果採用其他兩種方式就會導致後面的節點找不到位置了,也就無法釋放了。
if (p != NULL) {
recycle_nodes(p->left);
recycle_nodes(p->right);
free(p);
}
}
void insert_node(Node *p, int value) { //插入值,根據題目要求,小的插左邊,大的插右邊,同樣遞歸完成。
if (value < p->value && p->left != NULL) {
insert_node(p->left, value);
}
else if (value > p->value && p->right != NULL) {
insert_node(p->right, value);
}
else if (value > p->value && p->right == NULL) {
Node* temp = (Node*)malloc(sizeof(Node));
temp->value = value;
temp->left = NULL;
temp->right = NULL;
p->right = temp;
}
else if (value < p->value && p->left == NULL) {
Node* temp = (Node*)malloc(sizeof(Node));
temp->value = value;
temp->left = NULL;
temp->right = NULL;
p->left = temp;
}
}
Node* init_root(int value) { //初始化根節點,就是最上面的那個節點的地址。
Node* temp = (Node*)malloc(sizeof(Node));
temp->left = NULL;
temp->right = NULL;
temp->value = value;
return temp;
}
int main(void) {
int node_num, i = 0, temp;
Node *root = NULL;
scanf("%d", &node_num);
while (i < node_num) {
scanf("%d", &temp);
if (i == 0) root = init_root(temp);
else insert_node(root, temp);
i++;
}
traverse_tree_inorder(root);
printf("\n");
recycle_nodes(root);
return 0;
}
對了,順便說一下,如果是vs的編譯器,要在scanf之後加_s,也就是scanf_s,否則會報錯,如果有什麼不太合理的地方,歡迎大家幫忙指出來哈,編程初學者,希望能從大家的指教中獲取進步。