c语言写一个简单的二叉树
一、二叉树的存储优势:
二叉排序树是一种比较有用的折衷方案。
数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。
链表与之相反,删除和插入元素很快,但查找很慢。
二叉排序树就既有链表的好处,也有数组的好处。
在处理大批量的动态的数据是比较有用。
二叉树的建立:
百度的二叉树图篇
1.创建二叉树的节点
struct Node
{
int num;//定义二叉树的数据域
struct Node *left;//指针域
struct Node *right;//--
};
2、创建二叉树的跟节点
struct creatroot
{
struct Node *root;//创建根节点
};
3、创建树并存入数据
void creat_tree(struct creatroot *tree, int value)
{
struct Node *node = (struct Node *)malloc(sizeof(struct Node));//动态申请二叉树节点内存空间,地址赋值给node
node->num = value;//
node->left = NULL;//初始化左儿子和又儿子赋值为空
node->right = NULL;
if (tree->root == NULL) //判断该二叉树是否为空
{
tree->root = node; //若为空则把新创建的节点存到根
}
else 若不为空则执行插入操作
{
struct Node *p = tree->root;
while (p != NULL)
{
if (value < p->num)//比较节点的值,决定存入左儿子还是又儿子。
{
if (p->left == NULL)
{
p->left = node;//如果左儿子为空,则存入左儿子
return;
}
else
{
p=p->left;//如果不为空则反会上一级从新执行
}
}
else
{
if(p->right==NULL)
{
p->right=node;
return;
}
else
{
p=p->right;
}
}
}
}
return;
}
总的来说就是不停的比较二叉树节点的值和存入的值,找到空节点然后存进去。
4、二叉树的遍历
二叉树有前、中、后三种遍历方式。
A:前序遍历:
二叉树的没一个节点时,都保证先访问根结点,再访问左节点然后是右节点。
如图所示先序遍历便是先访问A其次是B然后是C。访问顺序为ABC。
B:中序遍历:
同上,保证每一次访问,都是先访问左子树,然后父节点,最后右子树。
C:后序遍历:
同上,保证每一次访问,都是先访问左子树,然后右子树,最后父节点。
一个简单的中序遍历
void look_all(struct Node *node) //遍历
{
if(node!=NULL)
{
look_all(node->left);//如果不为空则递归调用本函数,并打印节点信息
printf("%3d",node->num);
look_all(node->right);
}
}
5、主函数部分
void main(void)
{
struct creatroot tree;//创建树
tree.root=NULL;//初始化
int i,j;
printf("请输入元素个数:");
scanf("%d",&i);
clear();
for(j=1;j<=i;j++)
{
int p;
printf("请输入%d元素:",j);
scanf("%d",&p);
clear();
creat_tree(&tree,p);
}
look_all(tree.root);
system("pause");
return;
}
就是对以上功能的调用
三、完整代码
#include "stdlib.h"
#include "stdio.h"
void clear()
{
int ch;
while ((ch = getchar()) != EOF && ch != '\n');
}
struct Node
{
int num;
struct Node *left;
struct Node *right;
};
struct creatroot
{
struct Node *root;
};
void creat_tree(struct creatroot *tree, int value)
{
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->num = value;
node->left = NULL;
node->right = NULL;
if (tree->root == NULL)
{
tree->root = node;
}
else
{
struct Node *p = tree->root;
while (p != NULL)
{
if (value < p->num)
{
if (p->left == NULL)
{
p->left = node;
return;
}
else
{
p=p->left;
}
}
else
{
if(p->right==NULL)
{
p->right=node;
return;
}
else
{
p=p->right;
}
}
}
}
return;
}
void look_all(struct Node *node)
{
if(node!=NULL)
{
look_all(node->left);
printf("%3d",node->num);
look_all(node->right);
}
}
void main(void)
{
struct creatroot tree;
tree.root=NULL;
int i,j;
printf("请输入元素个数:");
scanf("%d",&i);
clear();
for(j=1;j<=i;j++)
{
int p;
printf("请输入%d元素:",j);
scanf("%d",&p);
clear();
creat_tree(&tree,p);
}
look_all(tree.root);
system("pause");
return;
}