swust oj980:输出利用先序遍历创建的二叉树的层次遍历序列解答 c++代码 queue队列方法

首先我们看题目:
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的层次遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的层次遍历序列。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入

输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

输出

每个用例用一行出该用例对应的二叉树的层次遍历序列。

 

解答

应该知道这个是进行层次遍历(可利用队列queue)

利用队列,每次循环从队头取一个节点

例如:

1结点作为根节点先入队,然后出队

2.3结点作为1的左右子结点入队

再取队头节点2,2弹出,让2的左右子结点入队,但是2只有右结点,就右结点4入队

以此类推,再取队头3,3弹出,让3的左右节点入队

如此循环,直到取到左右子结点为空,直接访问再弹出,然后继续访问下一个节点,直到结束

当队列为空时,就可以访问结束,得到该二叉树的层次遍历序列

通过以上推导

可得出以下关键代码:

void TreeOrder(TreeNode *Tree)
{
	if(Tree == NULL)return;
	queue<TreeNode *> Treeque;
	Treeque.push(Tree);
	while(!Treeque.empty())//当队列为空,就可以得到结果层次遍历序列
	{
		TreeNode *node = Treeque.front();
		cout<<node->data;
		if(node->left)
		{
			Treeque.push(node->left);
		}
		if(node->right)
		{
			Treeque.push(node->right);
		}
		Treeque.pop();
	}
}

以下是完整代码:

#include<bits/stdc++.h>
using namespace std;

struct TreeNode{
	char data;
	TreeNode *left,*right;
};
TreeNode *CreatTree()
{
	char x;
	TreeNode *T;
	cin>>x;
	if(x == '#')
	{
		return NULL;
	}
	else
	{
		T = new TreeNode[1];
		T->data = x;
		T->left = CreatTree();
		T->right = CreatTree();	
	}
	return T;
}
void TreeOrder(TreeNode *Tree)
{
	if(Tree == NULL)return;
	queue<TreeNode *> Treeque;
	Treeque.push(Tree);
	while(!Treeque.empty())
	{
		TreeNode *node = Treeque.front();
		cout<<node->data;
		if(node->left)
		{
			Treeque.push(node->left);
		}
		if(node->right)
		{
			Treeque.push(node->right);
		}
		Treeque.pop();
	}
}
int main()
{
	TreeNode *Tree;
	Tree = CreatTree();
	TreeOrder(Tree);
	return 0;
}

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值