计算二叉树的高度:

二叉树的高度,其实就是计算二叉树的层数

 可以使用层序遍历的思想,逐层增加,每增加一层,高度就加+1,这样就可以实现二叉树高度的计算:

大致执行步骤图解: 

 

非递归版代码部分:

int BtdepTh(BiTree T){
	if(!T){
		return 0;    //若此数为空 则高度为0
	}
	int front = -1,rear = -1;    //front用于记录当前访问的结点,rear用于记录最后一个元素
	int last = 0,level = 0;      //last用于遍历时记录每一层的最右端元素在数组中的位置
	BiTNode* p;                  //level为树的层数 也是高度
	BiTNode* Q[MaxSize];         //用于存放层序遍历的结点序列
	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){         //当遍历结点下标front刚好遍历到当前层的最右端元素时
			level++;             //层数增加 将last设置成下一层的最右端元素在序列中的位置
			last = rear;
		}
	}
	return level;
}

递归版代码部分:

int Btdepth2(BiTree T){
	if(T==NULL)    //走到叶子结点的孩子时 直接返回0
		return 0;
	int ldep = Btdepth2(T->lchild);    //往左走
	int rdep = Btdepth2(T->rchild);    //往右走
	if(ldep>rdep)                      //判断左边和右边哪个高度更高并且返回最大值
		return ldep+1;
	else
	 	return rdep+1;
}

计算二叉树的宽度:

二叉树的宽度其实就是指拥有最多结点数的层数的结点数

如果哪一层拥有的结点数最多,那么二叉树的宽度就是该层的结点数 

大概执行步骤如下图:

循环1:

这一步主要是为了先将每一层的孩子初始化,采用层序遍历的思想将孩子入队,并且设置他们对应的高度(所在层次)。

循环2:

 

 

代码部分:

typedef struct{
	BiTree data[MaxSize];    //存储结点的队列
	int level[MaxSize];      //存储结点所在的层数
	int front,rear;          //front表示当前遍历的结点下标
}Qus;                        //rear表示入队的结点的下标

int BtWeith(BiTree T){
	Qus Qu;                    
	BiTree p;int k,max,i,n;  //k用于存放当前层数,max存放最大宽度
	Qu.front = Qu.rear = -1; //先将front与rear下标设置为-1 因为队列下标0为开始位置
	Qu.rear++;               //将rear置于队头位置0
	Qu.data[Qu.rear]=T;      //根节点入队
	Qu.level[Qu.rear] = 1;   //根结点入队 就说明已经有一层 第一层一定只能有一个结点
	while(Qu.front<Qu.rear){
		Qu.front++;            
		p = Qu.data[Qu.front];    //获取队头结点
		k = Qu.level[Qu.front];   //获取当前结点所在层数
		if(p->lchild!=NULL){      //若有孩子就入队
			Qu.rear++;
			Qu.data[Qu.rear] = p->lchild;
			Qu.level[Qu.rear] = k+1;    //有孩子,说明还有下一层,高度加1
		}
		if(p->rchild!=NULL){
			Qu.rear++;
			Qu.data[Qu.rear] = p->rchild;
			Qu.level[Qu.rear] = k+1;
		}
	}
    //获取最大宽度的部分
	max = 0;i = 0;
	k = 1;  //从第一层开始遍历
	while(i<=Qu.rear){    //依次遍历所有结点
		n = 0;        
		while(i<=Qu.rear&&Qu.level[i]==k){    //遍历每一层
			n++;    //该层宽度增加
			i++;
		}
		k=Qu.level[i];  //获取下一层层数
		if(n>max) max = n;    //如果有更大的宽度 就将max设置为最大的宽度
	}
	return max;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐