首先我们看题目:
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的层次遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的层次遍历序列。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
每个用例用一行出该用例对应的二叉树的层次遍历序列。
解答
应该知道这个是进行层次遍历(可利用队列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;
}