LeetCode102.二叉树层次遍历

本文介绍了二叉树的两种层次遍历方法:不换行的层次遍历和按行输出的层次遍历。通过使用队列实现了广度优先搜索,能够有效地遍历并输出二叉树各层节点。提供了完整的C++实现代码及测试样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.二叉树的层次遍历(不换行)

  二叉树的层次遍历可以基于广度优先遍历的思想,利用队列完成。具体的,(1)先将根节点入队,然后取根节点的值,并出队;(2)访问根节点的左子树,若存在,则入队;访问根节点的右子树,若存在,则入队;(3)循环(1)和(2),直到树为空。

//数据结构
struct TreeNode
{
	int data;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int val):data(val){}
}
void BSTOrder(TreeNode* tree)
{
	if(tree == NULL)
	{
		return;
	}
	
	queue<TreeNode*>treeQueue;
	treeQueue.push(tree);
	TreeNode* curTreeNode = null;
	while(!queue.empty())
	{	
		curTreeNode = treeQueue.front();
		cout<<curTreeNode->data<<"\t";
		treeQueue.pop();
		if(tree->left != NULL)
		{
			treeQueue.push(tree->left);
		}
		if(tree->right != NULL)
		{
			treeQueue.push(tree->right);
		}
	}
}

2.二叉树的层次遍历(换行)

  二叉树要按行输出需要记录输出是否达到该层的最右孩子,若是,则换行。可以访问根节点时,记录根节点的左右孩子的个数(也就是下一层),每次输出一次孩子

void BSTLinesOrder(TreeNode* tree)
{
	if(tree == NULL)
	{
		return;
	}
	queue<TreeNode*>treeQueue;
	TreeNode* curTreeNode = NULL;
	int curTreeNodeCount = 1,nextTreeNodeCount = 0;
	treeQueue.push(tree);
	while(!treeQueue.empty())
	{
		curTreeNode = treeQueue.front();
		treeQueue.pop();
		cout<<curTreeNode->data<<"\t";
		curTreeNodeCount--;
		if(curTreeNode->left != NULL)
		{
			treeQueue.push(curTreeNode->left);
			nextTreeNodeCount++;
		}
		if(curTreeNode->right != NULL)
		{
			treeQueue.push(curTreeNode->right );
			nextTreeNodeCount++;
		}
		if(0 == curTreeNodeCount)
		{
			cout<<endl;
			curTreeNodeCount = nextTreeNodeCount;
		}
	}
}

测试:

int main()
{
	TreeNode* b1 = new TreeNode(1);
	TreeNode* b2 = new TreeNode(2);
	TreeNode* b3 = new TreeNode(8);
	TreeNode* b4 = new TreeNode(4);
	TreeNode* b5 = new TreeNode(9);
	TreeNode* b6 = new TreeNode(6);

	b1->leftChild = b2;
	b1->rightChild = b3;
	b2->leftChild = b4;
	b2->rightChild = b5;
	b3->leftChild = b6;

	//BSFOrder(b1);
	BSFLinesOrder(b1);
	
	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值