二叉树中序创建和遍历相关

今天开通新的博客,既然是一个新的程序员,那就写一些与我的专业相关的东西吧,由于初学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,否则会报错,如果有什么不太合理的地方,欢迎大家帮忙指出来哈,编程初学者,希望能从大家的指教中获取进步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章