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

来源:互联网 发布:mac os 10.8 升级 编辑:程序博客网 时间:2024/04/29 06:36

主要包含:建立、各种方式的遍历、求二叉树高度、求给定节点所在的层数、求二叉树的叶节点数。用C实现。

#include "stdio.h"#include "stdlib.h"#define MAXSIZE 100typedef 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");elseprintf("\'%d\'所在的层数:%d\n",x,level);}


原创粉丝点击