1.算法思想
使用层序遍历+队列实现求二叉树的高度。
2.定义结构体
typedef struct BiNode {
int data;
struct BiNode* lchild;
struct BiNode* rchild;
} BiNode,*BiTree;
3.函数实现
int getLevel(BiTree T) {
if(!T) {
return 0;
}
//level表示层数,front,rear表示队头队尾,last表示每层最后一个结点
int level=0, front=-1, rear=-1, last=0;
BiNode *Q[MAXSIZE], *p;//存放结点的队列以及工作指针
Q[++rear] = T;//根结点入队
while(front < rear) {
p = Q[++front];
if(p->lchild) {
Q[++rear] = p->lchild;
}
if(p->rchild) {
Q[++rear] = p->rchild;
}
if(front == last) {//到达该层最后一个结点
last = rear;
level++;
}
}
return level;
}
4.测试结果
测试的树结构:
结果如下:
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 20
typedef struct BiNode {
int data;
struct BiNode* lchild;
struct BiNode* rchild;
} BiNode,*BiTree;
//层序遍历+队列
int getLevel(BiTree T) {
if(!T) {
return 0;
}
//level表示层数,front,rear表示队头队尾,last表示每层最后一个结点
int level=0, front=-1, rear=-1, last=0;
BiNode *Q[MAXSIZE], *p;//存放结点的队列以及工作指针
Q[++rear] = T;//根结点入队
while(front < rear) {
p = Q[++front];
if(p->lchild) {
Q[++rear] = p->lchild;
}
if(p->rchild) {
Q[++rear] = p->rchild;
}
if(front == last) {//到达该层最后一个结点
last = rear;
level++;
}
}
return level;
}
int main() {
BiTree l1 = (BiTree)malloc(sizeof(BiNode));
BiNode *l2 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l3 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l4 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l5 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l6 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l7 = (BiNode *)malloc(sizeof(BiNode));
l1->data = 1;
l2->data = 2;
l3->data = 3;
l4->data = 4;
l5->data = 5;
l6->data = 6;
l7->data = 7;
l1->lchild = l2;
l1->rchild = l3;
l2->lchild = l4;
l2->rchild = l5;
l3->lchild = l6;
l3->rchild = l7;
l4->lchild = NULL;
l4->rchild = NULL;
l5->lchild = NULL;
l5->rchild = NULL;
l6->lchild = NULL;
l6->rchild = NULL;
l7->lchild = NULL;
l7->rchild = NULL;
int level = getLevel(l1);
printf("该二叉树的高度为:%d\n", level);
return 0;
}