计算二叉树的 高度/宽度(带图解)

计算二叉树的高度:

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

 可以使用层序遍历的思想,逐层增加,每增加一层,高度就加+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;
}

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是求二叉树高度宽度的完整代码(Python实现): ```python # 定义二叉树节点类 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 计算二叉树高度的函数 def get_tree_height(root): if not root: return 0 left_height = get_tree_height(root.left) right_height = get_tree_height(root.right) return max(left_height, right_height) + 1 # 计算二叉树宽度的函数 def get_tree_width(root): if not root: return 0 queue = [(root, 0)] cur_level = 0 cur_level_width = 0 max_width = 0 while queue: node, level = queue.pop(0) if level == cur_level: cur_level_width += 1 else: max_width = max(max_width, cur_level_width) cur_level = level cur_level_width = 1 if node.left: queue.append((node.left, level + 1)) if node.right: queue.append((node.right, level + 1)) max_width = max(max_width, cur_level_width) return max_width # 测试代码 if __name__ == '__main__': root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) root.right.right = TreeNode(7) print('树的高度为:', get_tree_height(root)) print('树的宽度为:', get_tree_width(root)) ``` 输出结果: ``` 树的高度为: 3 树的宽度为: 4 ``` 其中,`get_tree_height`函数用来计算二叉树高度,采用递归方式求解。`get_tree_width`函数用来计算二叉树宽度,采用BFS(广度优先搜索)算法,遍历每一层节点并统计宽度。测试代码中构建了一个示例二叉树,并输出了它的高度宽度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cristor404

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值