主要包含:建立、各种方式的遍历、求二叉树高度、求给定节点所在的层数、求二叉树的叶节点数。用C实现。
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
typedef struct BTree{
int data;
struct BTree *left;
struct BTree *right;
} * P_BTree,BTree;
typedef struct BTree_Queue{
P_BTree queue[MAXSIZE];
int head;
int tail;
}BTree_Queue;
int count=0;
int leaf_num=0;
P_BTree build_BTree_1(){
/*先序建立2叉树*/
P_BTree head;
int x;
scanf("%d",&x);
if(0==x){
head=NULL;
}
else{
head=(P_BTree)malloc(sizeof(BTree));
head->left=NULL;
head->right=NULL;
head->data=x;
printf("请输入%d的左节点:",head->data);
head->left=build_BTree_1();
printf("请输入%d的右节点:",head->data);
head->right=build_BTree_1();
}
return head;
}
void pre_order(P_BTree head){
if(head){
printf("%d",head->data);
pre_order(head->left);
pre_order(head->right);
}
else return;
}
void in_order(P_BTree head){
if(head){
in_order(head->left);
printf("%d",head->data);
in_order(head->right);
}
else return;
}
void lat_order(P_BTree head){
if(head){
lat_order(head->left);
lat_order(head->right);
printf("%d",head->data);
}
else return;
}
void level_order(P_BTree head){
/*层序遍历,借助队列*/
BTree_Queue temp;
if(head){
temp.queue[0]=head;
temp.head=0;
temp.tail=1;
}
/*这里没有做边界检查*/
while(temp.head!=temp.tail){
printf("%d",temp.queue[temp.head]->data);
if(temp.queue[temp.head]->left){
temp.queue[temp.tail]=temp.queue[temp.head]->left;
temp.tail++;
}
if(temp.queue[temp.head]->right){
temp.queue[temp.tail]=temp.queue[temp.head]->right;
temp.tail++;
}
temp.head++;
}
}
void get_NodeNum(P_BTree head){
if(head){
count++;
get_NodeNum(head->left);
get_NodeNum(head->right);
}
else return;
}
void get_LeafNum(P_BTree head){
if(head){
if(!head->left&&!head->right){
leaf_num++;
}
get_LeafNum(head->left);
get_LeafNum(head->right);
}
else return;
}
void get_level_x(P_BTree head,int x,int *level,int current_level){
if(!head) /*没有找到*/
*level=-1;
else if(head->data==x){ /*找到*/
*level=current_level;
}
else{ /*先找左子树后找右子树*/
get_level_x(head->left,x,level,current_level+1);
if(-1==*level){ /*左子树没找到*/
get_level_x(head->right,x,level,current_level+1);
}
}
}
int get_height(P_BTree head){
int h1;
int h2;
if(!head){
return 0;
}
else{
h1=get_height(head->left);
h2=get_height(head->right);
if(h1>=h2)return 1+h1;
else return 1+h2;
}
}
void main(){
P_BTree B_Head;
int x,level;
B_Head=build_BTree_1();
printf("先序遍历:");
pre_order(B_Head);
printf("\n中序遍历:");
in_order(B_Head);
printf("\n后续遍历:");
lat_order(B_Head);
printf("\n层序遍历:");
level_order(B_Head);
printf("\n节点总数:");
get_NodeNum(B_Head);
printf("%d",count);
get_LeafNum(B_Head);
printf("\n叶节点总数:%d",leaf_num);
printf("\n二叉树的高度:%d",get_height(B_Head));
printf("\n输入查询的值:");
scanf("%d",&x);
get_level_x(B_Head,x,&level,1);
if(-1==level)
printf("二叉树中没有该节点\n");
else
printf("\'%d\'所在的层数:%d\n",x,level);
}