关于二叉树的代码实现

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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值