二叉樹中序創建和遍歷相關

今天開通新的博客,既然是一個新的程序員,那就寫一些與我的專業相關的東西吧,由於初學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,否則會報錯,如果有什麼不太合理的地方,歡迎大家幫忙指出來哈,編程初學者,希望能從大家的指教中獲取進步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章