二叉树的存储方式分为顺序存储和链式存储,其中顺序存储主要依靠数组实现,且只比较适用于完全二叉树,
struct bintree
{
int data;
struct bintree* lchild;
struct bintree* rchild;
};
常用算法:
struct bintree* create()//先序存储节点值
{
int data;
struct bintree* T;
printf("请输入要输入的节点值");
scanf_s("%d", &data);//0作为该子树输出结束的标志
if (data == 0)
T = NULL;
else
{
T = (struct bintree*)malloc(len);
T->data = data;
printf("左子树");
T->lchild=create();
printf("右子树");
T->rchild=create();
}
return T; //返回头节点;
}
void PreOrderTraverse(struct bintree* t) {//先序遍历,
if (t) {
printf("% d", t->data);
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
}
}
void InOrederTraverse(struct bintree* t) {//中序遍历
if (t) {
InOrederTraverse(t->lchild);
printf("% d", t->data);
InOrederTraverse(t->rchild);
}
}
void PostOrederTraverse(struct bintree* t) {//后序遍历
if (t) {
PostOrederTraverse(t->lchild);
PostOrederTraverse(t->rchild);
printf("% d", t->data);
}
}
层次遍历,利用队列先进后出简化,
void LevelOrderTraverse(struct bintree* t) {//层次遍历
quene q = createquene();//初始化队列
if (t) {
insert(q, t);
}
while (isempty(q)==0) { //当队列不为空时进行循环
struct bintree* z = deletex(q);
printf("%d\n", z->data);
if (z->lchild!=NULL) { //循环每一层节点的子树并加入队列
insert(q, z->lchild);
}
if (z->rchild!=NULL) {
insert(q, z->rchild);
}
}
}