二叉树的建立、遍历、查询、求高度

主要包含:建立、各种方式的遍历、求二叉树高度、求给定节点所在的层数、求二叉树的叶节点数。用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);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值