二叉树结构:
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;
}