有以下几点需要注意:
1.为根节点分配内存时,需要在函数中为一个指针分配内存,再将该指针作为返回值,用在主函数中定义的根节点指针接收该返回值。(不能将指针作为参数还妄想要给他分配内存)
2.我在将数据存入二叉树时是按大小存入的(左节点<根节点<右节点),用中序遍历即可得到升序排列。
3.该程序在linux 64位操作系统上成功运行。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node
{
int value;
int count;
Node *left;
Node *right;
};
Node* create(int n);//创建根节点
Node* add(Node* ,int);//创建子树节点
void list(Node* root);//遍历方式
void freeNode(Node*root);//释放内存
int main(void)
{
int n=0;
Node* root=NULL;
printf("Input the value(quit when you input -1):");
scanf("%d",&n);
while(n!=-1)
{
if(!root){
root=create(n);
}
else{
root=add(root,n);
}
printf("Input the value(quit when you input -1):");
scanf("%d",&n);
}
list(root);
freeNode(root);
return 0;
}
Node* create(int n)
{
Node*root=(Node*)malloc(sizeof(Node));
root->value=n;
root->count=1;
return root;
}
Node* add(Node* root,int n)
{
if(!root){
root=create(n);
root->value=n;
return root;
}
if(root->value==n){
root->count++;
}else if(n<root->value){
root->left=add(root->left,n);
}else{
root->right=add(root->right,n);
}
return root;
}
void list(Node* root)
{//中序遍历(前序,后序与此类似)
if(!root)
return;
list(root->left);
printf("%d ",root->value);
list(root->right);
}
void freeNode(Node*root)
{
if(!root)
return;
freeNode(root->left);
freeNode(root->right);
free(root);
}
我发这篇博客主要是为了和大家一起分享,因为我之前刚开始学习二叉树时一直没有找到一个合适的实现示例,希望这篇博客对大家有帮助。