65,174
社区成员




在学习二叉树的时候,自己尝试写二叉树的各个实现方法:
0.树节点的定义
#define data_type int
typedef struct tree_node
{
data_type data;
struct tree_node* left;
struct tree_node* right;
} tree_node;
typedef tree_node* Pnode;
typedef tree_node* RootNode;
1.节点初始化
Pnode tree_node_init()
{
tree_node* tree = (tree_node*)malloc(sizeof(tree_node));
if(tree == NULL)
{
perror("tree_node malloc : ");
}
//tree->data = 0;
tree->left = NULL;
tree->right = NULL;
return tree;
}
2.树的初始化
RootNode tree_creat(data_type data)
{
Pnode tree;
tree = tree_node_init();
tree->data = data;
return tree;
}
3.插入节点
void node_insert(RootNode tree, data_type data)
{
Pnode temp;
Pnode next;
temp = tree;
if(tree != NULL)
{
if(data < temp->data)
{
if(temp->left != NULL)
{
node_insert(temp->left, data);
}
if(temp->left == NULL)
{
next = tree_node_init();
next->data = data;
temp->left = next;
}
}
if(data > temp->data)
{
if(temp->right != NULL)
{
node_insert(temp->right, data);
}
if(temp->right == NULL)
{
next = tree_node_init();
next->data = data;
temp->right = next;
}
}
if(data == temp->data)
{
temp->data = data;
}
}
else
{
tree = tree_node_init();
tree->data = data;
}
}
4.打印整棵树
void print_tree(RootNode tree)
{
Pnode temp,left,right;
temp = tree;
if(tree == NULL)
{
printf("the tree is empty!\n");
}
else if (tree != NULL)
{
if(temp->left != NULL)
{
left = temp->left;
print_tree(left);
}
printf("%d\n",temp->data);
if(temp->right != NULL)
{
right = temp->right;
print_tree(right);
}
}
}
5.释放整棵树
RootNode free_tree(RootNode tree)
{
Pnode temp;
Pnode left;
Pnode right;
temp = tree;
if(temp->left != NULL)
{
left = temp->left;
free_tree(left);
temp->left = NULL;
}
if(temp->right != NULL)
{
right = temp->right;
free_tree(right);
temp->right = NULL;
}
free(tree);
tree = NULL;
return tree;
}
6.主函数
int main()
{
RootNode num1 = tree_creat(10);
node_insert(num1,3);
node_insert(num1,5);
node_insert(num1,1);
node_insert(num1,4);
node_insert(num1,12);
node_insert(num1,45);
node_insert(num1,7);
node_insert(num1,9);
node_insert(num1,82);
print_tree(num1);
printf("--------------\n");
print_tree(num1);
printf("--------------\n");
print_tree(num1);
printf("--------------\n");
num1 = free_tree(num1);
print_tree(num1);
printf("#######--------------#######");
return 0;
}
代码相关内容就是这些(完整代码附在末尾),在运行时遇到了问题:
当我使用调试功能让代码逐行或逐过程运行时,输出结果正常,且结果与预期相符,结果如下:
同样,与此过程相同,当我在每一次调用“打印整棵树”功能函数之前,添加一个延时函数,让其每此打印之后延时2s或3s,采取编译运行的方式,同样可以取得与调试运行相同的结果。
当我选择不添加延时函数,直接采取编译运行的方式时,就会产生与预期不符的输出,结果如下:
以上结果都是在VSCode 编辑器中运行所得,在我尝试更换Dev C++ 的环境后,发现更换环境后第一次编译运行可以得到正确的输出结果,但第二次开始结果就不再与预期相符。
不清楚这是什么原因导致的,或许是由于指针的使用不当造成的,但我并没有搞明白这究竟是什么造成的,希望能够获得大佬们的解答。
另外,在我只使用一次或两次“打印整棵树”的功能函数时,输出结果也是正确的,但当我使用上第三次该函数时结果就出现了问题,不知道是什么原因导致的。
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define data_type int
typedef struct tree_node
{
data_type data;
struct tree_node* left;
struct tree_node* right;
} tree_node;
typedef tree_node* Pnode;
typedef tree_node* RootNode;
Pnode tree_node_init();
RootNode tree_creat(data_type data);
void node_insert(RootNode tree, data_type data);
void print_tree(RootNode tree);
RootNode free_tree(RootNode tree);
int main()
{
RootNode num1 = tree_creat(10);
node_insert(num1,3);
node_insert(num1,5);
node_insert(num1,1);
node_insert(num1,4);
node_insert(num1,12);
node_insert(num1,45);
node_insert(num1,7);
node_insert(num1,9);
node_insert(num1,82);
print_tree(num1);
printf("--------------\n");
print_tree(num1);
printf("--------------\n");
print_tree(num1);
printf("--------------\n");
num1 = free_tree(num1);
print_tree(num1);
printf("#######--------------#######");
return 0;
}
Pnode tree_node_init()
{
tree_node* tree = (tree_node*)malloc(sizeof(tree_node));
if(tree == NULL)
{
perror("tree_node malloc : ");
}
//tree->data = 0;
tree->left = NULL;
tree->right = NULL;
return tree;
}
RootNode tree_creat(data_type data)
{
Pnode tree;
tree = tree_node_init();
tree->data = data;
return tree;
}
void node_insert(RootNode tree, data_type data)
{
Pnode temp;
Pnode next;
temp = tree;
if(tree != NULL)
{
if(data < temp->data)
{
if(temp->left != NULL)
{
node_insert(temp->left, data);
}
if(temp->left == NULL)
{
next = tree_node_init();
next->data = data;
temp->left = next;
}
}
if(data > temp->data)
{
if(temp->right != NULL)
{
node_insert(temp->right, data);
}
if(temp->right == NULL)
{
next = tree_node_init();
next->data = data;
temp->right = next;
}
}
if(data == temp->data)
{
temp->data = data;
}
}
else
{
tree = tree_node_init();
tree->data = data;
}
}
void print_tree(RootNode tree)
{
Pnode temp,left,right;
temp = tree;
if(tree == NULL)
{
printf("the tree is empty!\n");
}
else if (tree != NULL)
{
if(temp->left != NULL)
{
left = temp->left;
print_tree(left);
}
printf("%d\n",temp->data);
if(temp->right != NULL)
{
right = temp->right;
print_tree(right);
}
}
}
RootNode free_tree(RootNode tree)
{
Pnode temp;
Pnode left;
Pnode right;
temp = tree;
if(temp->left != NULL)
{
left = temp->left;
free_tree(left);
temp->left = NULL;
}
if(temp->right != NULL)
{
right = temp->right;
free_tree(right);
temp->right = NULL;
}
free(tree);
tree = NULL;
return tree;
}