1.二叉树的建立和生成
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXNODE 10
typedef struct BiNode{
int data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
void Visit(int data){
printf("%3d",data);
}
//建立一个空的二叉数
int Initiate(BiTree bt){
//初始化建立二叉树*bt的头结点,0表示建立失败,1表示成功*/
if((bt=(BiNode *)malloc(sizeof(BiNode))) == NULL) return 0;
bt->lchild=NULL;
bt->rchild=NULL;
return 1;
}
//生成一颗二叉树
BiTree Create(int x,BiTree lbt,BiTree rbt){
//生成一颗以x为根结点的数据域信息,以lbt和rbt为左右子树的二叉数
BiTree p;
if((p=(BiNode *)malloc(sizeof(BiNode))) == NULL) return NULL;
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
return p;
} ```
1.二叉树的插入结点
//在二叉数中插入一个结点
BiTree InsertL(BiTree bt,int x,BiTree parent){
//在二叉树bt结点parent的左子树中插入结点数据元素x
BiTree p;
if(parent == NULL){
printf("\n插入错误");
return NULL;
}
if((p=(BiNode *)malloc(sizeof(BiNode))) ==NULL) return NULL;
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(parent->lchild ==NULL){
parent->lchild =p;
}else{
p->lchild=parent->lchild;
parent->lchild = p;
}
return bt;
}
BiTree InsertR(BiTree bt,int x,BiTree parent){
//在二叉树bt结点parent的右子树中插入结点数据元素x
BiTree p;
if(parent == NULL){
printf("\n插入错误");
return NULL;
}
if((p=(BiNode *)malloc(sizeof(BiNode))) ==NULL) return NULL;
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(parent->rchild ==NULL){
parent->rchild =p;
}else{
p->rchild=parent->rchild;
parent->rchild = p;
}
return bt;
}
3.二叉树的遍历
//先序遍历
void PreOrder(BiTree bt){
if(bt == NULL)return;
Visit(bt->data); //访问结点的数据域
PreOrder(bt->lchild); //递归遍历bt的左子树
PreOrder(bt->rchild);//递归遍历bt的右子树
}
//中序遍历
void InOrder(BiTree bt){
if(bt == NULL)return;
InOrder(bt->lchild);
Visit(bt->data);
InOrder(bt->rchild);
}
//后序遍历
void PostOrder(BiTree bt){
if(bt == NULL)return;
PostOrder(bt->lchild);
PostOrder(bt->rchild);
Visit(bt->data);
}
//层次遍历二叉树
void LevelOrder(BiTree bt){
BiTree Queue[MAXNODE];//指针数组
int front,rear;
if(bt==NULL)exit(0);
front=-1;
rear=0;
Queue[rear]=bt;
while(front != rear){
front++;
//访问队首结点的数据域
Visit(Queue[front]->data);
//将队首结点的左孩子结点进队
if(Queue[front]->lchild != NULL){
rear++;
Queue[rear]=Queue[front]->lchild;
}
//将队首结点的右孩子结点进队
if(Queue[front]->lchild != NULL){
rear++;
Queue[rear]=Queue[front]->rchild;
}
}
}
以上我的二叉树函数的搭建。下面简单的设计了一下主函数
4.主函数
int main(){
BiTree t;
int e;
int n,i,k;
printf("请输入二叉数结点的个数:\n");
scanf("%d",&n);
printf("请输入二叉树根结点的元素值:");
scanf("%d",&e);
t=Create(e,NULL,NULL);
for(i=1;i<n;i++){
printf("第%d个结点插入位置为:\n1.作为根结点的左子树\n2.作为根结点的右子树\n3.作为根结点的左子树的左子树\n4.作为根结点的左子树的右子树\n5.作为根结点的右子树的左子树\n6.作为根结点的右子树的右子树\n(1~6)",i+1);
scanf("%d",&k);
printf("请输入二叉树第%d个结点的元素值",i+1);
scanf("%d",&e);
switch(k){
case 1:t=InsertL(t,e,t);break;
case 2:t=InsertR(t,e,t);break;
case 3:t=InsertL(t,e,t->lchild);break;
case 4:t=InsertR(t,e,t->lchild);break;
case 5:t=InsertL(t,e,t->rchild);break;
case 6:t=InsertR(t,e,t->rchild);break;
}
}
printf("先序遍历二叉树结果为:\n");
PreOrder(t);
printf("\n");
printf("中序遍历二叉树结果为:\n");
InOrder(t);
printf("\n");
printf("后序遍历二叉树结果为:\n");
PostOrder(t);
printf("\n");
printf("层序遍历二叉树结果为:\n");
LevelOrder(t);
printf("\n");
return 0;
}