数据结构-树的高度

【题目来自灰灰考研】

2017武汉科技大学初试

二叉树采用二叉链表进行存储(如下所示),每个结点包含数据域Data,左孩子指针域left和右孩子指针域right。请设计非递归算法统计二叉树的高度。

Typedef struct BitNode{   

TElemType data;  

      struct BitNode *left, *right;

} *BiTree ;

#include<iostream>
#include<cstring>
#include<cstdlib>
#define MAXSIZE 30 
using namespace std;

typedef struct TNode{
	char data;
	struct TNode *lChild;
	struct TNode *rChild;
}TNode;

int height = 0;

TNode *createBTree()
{
	//124##57###38#9###
	char data;
	cin>>data;
	TNode *bt = NULL;
	if(data == '#')
		return NULL;
	else
	{
		
		bt = (TNode*)malloc(sizeof(TNode));
		bt->data = data;
		bt->lChild = createBTree();
		bt->rChild = createBTree();
	}
	return bt;
}

void preOrderRecursionVisit(TNode *bt)
{
	/*
		先序遍历二叉树 
	*/ 
	if(bt == NULL)
		return;
	else
	{
		cout<<bt->data<<" ";
		preOrderRecursionVisit(bt->lChild);
		preOrderRecursionVisit(bt->rChild);
	}
}

void getTreeHeight(TNode *root)
{
	/*
		使用层次遍历,使用temp 记录访问节点的个数 
		在第一层我们易知只有一个节点(如果存在的话),
			循环出队,访问元素个数temp+1,然后将出队元素的子女节点加入队列(如果存在)
				判断:如果访问节点的个数大于等于当前层的节点数,则当前层访问完毕,访问计数归零,树高+1,
					同时我们可以进行计算下一 层节点的个数,因为当前队列存储的所有节点都是下一层的,计算队列长度就是下一层的节点数 
			 
		循环执行,直到队列为空 
	*/
	int front = 0, rear = 0, temp = 0, count = 1;
	TNode *queue[MAXSIZE], *t;
	rear = (rear + 1) % MAXSIZE;
	queue[rear] = root;
	while(rear != front)
	{
		front = (front + 1) % MAXSIZE;
		t = queue[front];
		temp++;
		if(t->lChild)
		{
			rear = (rear + 1) % MAXSIZE;
			queue[rear] = t->lChild;
		}
		if(t->rChild)
		{
			rear = (rear + 1) % MAXSIZE;
			queue[rear] = t->rChild;
		}
		if(temp >= count)
		{
			temp = 0;
			count = (rear - front + MAXSIZE) % MAXSIZE;
			height++;
		}
	}
}

int main()
{
	TNode *root;
	root = createBTree();
	preOrderRecursionVisit(root);
	cout<<endl;
	
	getTreeHeight(root);
	cout<<"The Height Is"<<height<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LiuKe369/article/details/81266894