二叉树的层次遍历

二叉树除了先序遍历、中序遍历、后序遍历以外还有层次遍历,比如说下面这颗二叉树的层次遍历的结果为:ABGCDHEF

二叉树的层次遍历_第1张图片
我们可以使用一个队列来对它进行层次遍历,根据队列先进先出的特点,可以有如下所示的过程来对一颗二叉树进行层次遍历:

二叉树的层次遍历_第2张图片

接下来用代码实现上述过程:

void LevelOrder(BtNode* ptr)
{
     
	if (ptr == NULL)
	{
     
		return;
	}
	queue<BtNode*> que;
	que.push(ptr);
	while (!que.empty())
	{
     
		ptr = que.front();
		que.pop();
		cout << ptr->data << " ";
		if (ptr->leftchild != NULL)
		{
     
			que.push(ptr->leftchild);
		}
		if (ptr->rightchild != NULL)
		{
     
			que.push(ptr->rightchild);
		}
	}
	cout << endl;
}

从运行结果可以看到我们完成了二叉树的层次遍历:

二叉树的层次遍历_第3张图片
接着我们在介绍另外一种遍历方式,“S”型遍历,如下面一颗二叉树遍历的结果,图解如下:

二叉树的层次遍历_第4张图片
最终遍历结果为AGBCDHFE。

我们可以通过两个栈来实现这样的遍历,代码如下:

void SorderTree(BtNode* ptr)
{
     
	if (ptr == NULL) return;
	stack<BtNode*> lst;
	stack<BtNode*> rst;
	lst.push(ptr);
	while (!lst.empty() || !rst.empty())
	{
     
		while (!lst.empty())
		{
     
			ptr = lst.top();
			lst.pop();
			cout << ptr->data << " ";
			if (ptr->leftchild != NULL)
			{
     
				rst.push(ptr->leftchild);
			}
			if (ptr->rightchild != NULL)
			{
     
				rst.push(ptr->rightchild);
			}
		}
		while (!rst.empty())
		{
     
			ptr = rst.top();
			rst.pop();
			cout << ptr->data << " ";
			if (ptr->rightchild != NULL)
			{
     
				lst.push(ptr->rightchild);
			}
			if (ptr->leftchild != NULL)
			{
     
				lst.push(ptr->leftchild);
			}
		}
	}
}

运行结果如下:

二叉树的层次遍历_第5张图片
我们所要求的“S”型遍历结果也出来了。

你可能感兴趣的:(旺财的菜鸡篇)