层次遍历求二叉树最大宽度

核心思想:二叉树层次i的结点遍历结束后,层次i+1的结点已全部进队,此时队列的元素个数即为层次 i + 1的宽度

难点:如何判断二叉树层次i已经遍历结束呢?可采用一个变量width记录层次i的结点个数,每出队一个元素,变量width减一,当width == 0时,表明层次i遍历完毕。

二叉树层次i遍历结束后(width == 0),只需要用当前队列的元素个数来更新width,表示二叉树层次i + 1的结点个数

int BTWidth(BTNode *b)
{
	if(b == NULL)   //为空树,返回宽度为0
		return 0;

	int width, max;
	int i = 1, max_i; //初始化二叉树层次i,最大宽度所在层次max_i
	BTNode * p;
	SqQueue * qu;       
	InitQueue(qu);     //初始化层次遍历需要借助的队列
	enQueue(qu, b);    //树不为空,根节点进队
	width = 1;         // 宽度置为1
	max = width;       //最大宽度为1
	max_i = i;         //最大宽度所在层次

	while(!QueueEmpty(qu))   //队列为空,表明二叉树遍历完毕,退出循环
	{
		deQueue(qu, p);      //节点出队,赋给p
		width --;            //出队一次,width减1
		if(p -> lchild != NULL) //出队节点的左孩子进队
			enQueue(qu, p -> lchild);
		if(p -> rchild != NULL)
			enQueue(qu, p -> rchild); //出队节点的右孩子出队

		if(width == 0)  //width == 0,表示当前层次i所有节点已遍历完毕
		{               //此时队列元素个数即为下一层次 i + 1 的节点个数
			width = (qu->rear - qu->front + MaxSize) % MaxSize;  //更新宽度
			i++;     //层次变为下一层 i + 1
			if(width > max)  //如果层次 i + 1 宽度 > max
			{
				max = width;  //更新max
				max_i = i;   //并记录最大宽度所在层次
			}
		}
	}

	printf("二叉树层次 %d 的宽度最大\n", max_i);
	return max;
}
好的,以下是一个实现上述功能的C++程序示例。这个程序将创建一个二叉树,并实现以下功能: 1. 输出二叉树的结点个数。 2. 输出二叉树的叶子结点个数。 3. 二叉树中指定结点值的结点层次。 4. 利用层次遍历二叉树宽度。 ```cpp #include <iostream> #include <queue> using namespace std; // 定义二叉树的结点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 创建二叉树(这里只是示例,实际使用中可以根据需要创建) TreeNode* createTree() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->right->left = new TreeNode(6); root->right->right = new TreeNode(7); return root; } // 计算结点个数 int countNodes(TreeNode* root) { if (root == NULL) return 0; return 1 + countNodes(root->left) + countNodes(root->right); } // 计算叶子结点个数 int countLeaves(TreeNode* root) { if (root == NULL) return 0; if (root->left == NULL && root->right == NULL) return 1; return countLeaves(root->left) + countLeaves(root->right); } // 计算指定结点值的结点层次 int findLevel(TreeNode* root, int val, int level) { if (root == NULL) return 0; if (root->val == val) return level; int left = findLevel(root->left, val, level + 1); if (left != 0) return left; return findLevel(root->right, val, level + 1); } // 计算二叉树宽度 int getWidth(TreeNode* root) { if (root == NULL) return 0; queue<TreeNode*> q; q.push(root); int maxWidth = 0; while (!q.empty()) { int count = q.size(); maxWidth = max(maxWidth, count); for (int i = 0; i < count; i++) { TreeNode* temp = q.front(); q.pop(); if (temp->left != NULL) q.push(temp->left); if (temp->right != NULL) q.push(temp->right); } } return maxWidth; } int main() { TreeNode* root = createTree(); cout << "二叉树的结点个数: " << countNodes(root) << endl; cout << "二叉树的叶子结点个数: " << countLeaves(root) << endl; int val = 5; cout << "结点值为 " << val << " 的结点层次: " << findLevel(root, val, 1) << endl; cout << "二叉树宽度: " << getWidth(root) << endl; return 0; } ``` 这个程序首先创建了一个示例二叉树,然后实现了四个功能函数: 1. `countNodes` 函数用于计算二叉树的结点个数。 2. `countLeaves` 函数用于计算二叉树的叶子结点个数。 3. `findLevel` 函数用于查找指定结点值的结点层次。 4. `getWidth` 函数用于计算二叉树宽度。 在 `main` 函数中,调用了这些函数并输出结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值