第三章——树(二叉树)

二叉树结构:

typedef struct tree{
 struct tree *left;//左儿子
    struct tree *right;//右儿子
    int data;//数据
}TNode,*BTree;

1.编写函数,输入序列,先序建立二叉树的二叉链表。
2.编写函数,实现二叉树的先序、中序、后序、层序遍历操作。
3.编写函数,求二叉树的结点个数。
 

先序建立二叉树:

//先序创建二叉树
void Create(BTree &T){
	int num;
	scanf("%d",&num);
	if(num==-1)T=NULL;//输入-1时表示为空
	else{
		T=(TNode*)malloc(sizeof(TNode));
		T->data=num;
		Create(T->left);
		Create(T->right);
	}
} 

先序、中序、后序遍历二叉树:

void prePrint(BTree T){
 //先序遍历
 if(!T)return;
    if(T){
     printf("%d ",T->data);
     prePrint(T->left);
     prePrint(T->right);
    }
}
void tailPrint(BTree T){
 //后序遍历
    if(T){
     tailPrint(T->left);
        tailPrint(T->right);
        printf("%d ",T->data); 
    }
}
void midPrint(BTree T){
 //中序遍历
    if(T){
     midPrint(T->left);
      printf("%d ",T->data);
        midPrint(T->right); 
    }
}

层序遍历二叉树:

利用队列,首先从根开始将结点入队,进入循环。出队,判断该结点的左儿子是否为空,如果不为空则入队;右儿子同理,循环此操作直到队列为空.

void cenPrint(BTree T){
    //层序遍历
    //利用队列进行遍历
    Queue q;//创建一个队列 
	LoadQueue(&q);
    push(&q,T);
    while(!isEmpty(q)){
     TNode *v=pop(&q);
        printf("%d ",v->data);
        if(v->left)push(&q,v->left);
        if(v->right)push(&q,v->right);
    }
    //直到队列为空便已经层序遍历完毕
}

计算结点数:

//递归计算结点数 
int nodeCount(BTree T){
	if(T==NULL)return 0;
	else return nodeCount(T->left)+nodeCount(T->right) +1;
}

完整代码:

(队列的细节可以忽略,只是用来辅助完成的。重点放在二叉树这一块)

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
typedef struct tree{
 struct tree *left;//左儿子
    struct tree *right;//右儿子
    int data;
}TNode,*BTree;
typedef struct{
    BTree data[MAXSIZE];    
    int head;//头结点
    int tail;//尾巴结点    
}Queue;
void LoadQueue(Queue *q){
  	 q->head=q->tail=0; 
}
void push(Queue *q,BTree value){
    int t=q->tail;
    q->tail=(q->tail+1)%MAXSIZE;//循环队列 
  	q->data[t]=value;  
}
BTree pop(Queue *q){
    int t=q->head;
    q->head=(q->head+1)%MAXSIZE;
    return q->data[t];   
}
int isEmpty(Queue q){
	if(q.head==q.tail){
		return 1;
	}
	return 0;
}
//先序创建二叉树
void Create(BTree &T){
	int num;
	scanf("%d",&num);
	if(num==-1)T=NULL;
	else{
		T=(TNode*)malloc(sizeof(TNode));
		T->data=num;
		Create(T->left);
		Create(T->right);
	}
} 
void prePrint(BTree T){
 //先序遍历
 if(!T)return;
    if(T){
     printf("%d ",T->data);
     prePrint(T->left);
     prePrint(T->right);
    }
}
void tailPrint(BTree T){
 //后序遍历
    if(T){
     tailPrint(T->left);
        tailPrint(T->right);
        printf("%d ",T->data); 
    }
}
void midPrint(BTree T){
 //中序遍历
    if(T){
     midPrint(T->left);
      printf("%d ",T->data);
        midPrint(T->right); 
    }
}
//计算结点数 
int nodeCount(BTree T){
	if(T==NULL)return 0;
	else return nodeCount(T->left)+nodeCount(T->right) +1;
}
void cenPrint(BTree T){//直到队列为空便已经层序遍历完毕
    //层序遍历
    //利用队列进行遍历
    Queue q;//创建一个队列 
	LoadQueue(&q);
    push(&q,T);
    while(!isEmpty(q)){
     TNode *v=pop(&q);
        printf("%d ",v->data);
        if(v->left)push(&q,v->left);
        if(v->right)push(&q,v->right);
    }  
}
int main(){
	BTree T;
	//1 2 3 -1 -1 4 5 -1 7 -1 -1 6 -1 -1 -1
	printf("先序创建二叉树,输入-1为空树\n");
	Create(T);
	printf("先序:");
    prePrint(T);
    printf("\n");
    printf("中序:");
    midPrint(T);
    printf("\n");
    printf("后序:");
    tailPrint(T);
    printf("\n");
    printf("层序:");
    cenPrint(T);
    printf("\n");
    printf("结点数是:%d\n",nodeCount(T));
 	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值