非递归求二叉树高度


    题目:假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度
    分析:
        若要采用非递归的方式来求得二叉树的高度,我们采用层次遍历是最合适的,因为这一层一层的不就很好数吗哈哈。具体实现:
        这里唯一的难点就在于我们如何得知高度该加一了;我们可以设置一个标志num用来记录每一层入栈的节点个数,当我们出栈数
        达到该数值时也就意味着我们的高度该加一了。

代码

struct biTree {
	char data;
	struct biTree *lchild;
	struct biTree *rchild;
};
struct Squeue {
	biTree *arr;
	int front, rear;
};

#include <stdio.h>
#include <stdlib.h>

int getHigh(biTree *T,Squeue *sq,int maxSize) {
	int oldNum=0,curNum=0,high=0;//记录一层有多少节点
	struct biTree *p = T;
	struct biTree *r=(struct biTree *)malloc(sizeof(struct biTree));
	bool enQueueS(Squeue *, biTree *, int );
	bool isEmpty(Squeue *);
	bool deQueueS(Squeue *, biTree *, int);

	enQueueS(sq,p,maxSize);//将根节点入队
	oldNum++;//此时队列中只有一个节点

	while (!isEmpty(sq)) {
		deQueueS(sq,r,maxSize);//取出队首元素
		if (r->lchild) {
			curNum++;//下一层的节点数+1
			enQueueS(sq, r->lchild, maxSize);//将根节点入队
		}
		if (r->rchild) {
			curNum++;//下一层的节点数+1
			enQueueS(sq, r->rchild, maxSize);//将根节点入队
		}
		if (!--oldNum) {//如果一层的元素已取完,高度+1
			high++;
			oldNum = curNum;//当oldNum=0时,将下一层的节点数赋给它
			curNum = 0;//下一层节点归零
		}
		
	}
	return high;
}
int main() {
	int count=0;
	//创建二叉树、队列
	struct biTree *T=(struct biTree *)malloc(sizeof(struct biTree));
	struct Squeue *sq;
	biTree *create(biTree *);
	void nodeNum(biTree *,int *);
	Squeue *createQueue(int);
	T = create(T);
	nodeNum(T,&count);
	sq = createQueue(count);//创建一个大小为树节点个数的队列

	printf("该二叉树的高度为:%d",getHigh(T, sq, count));
	return 0;
}

努力的人生才是最好的,不要在花一样的年纪荒废了青春,真正能激励我们前行的并不是励志语录,而是身边朋友的积极上进与充满正能量的人同行!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值