今天开通新的博客,既然是一个新的程序员,那就写一些与我的专业相关的东西吧,由于初学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,否则会报错,如果有什么不太合理的地方,欢迎大家帮忙指出来哈,编程初学者,希望能从大家的指教中获取进步。