/*
本以爲樹開始覺得差不多了,就是個遞歸或者用隊列,沒想到筆試居然要用層次遍歷建立二叉樹,然後按前序遍歷輸出,以前建樹都是遞歸。所以這道題就gg,後來自己又想的做出來了
*/
題目意思是輸入一個層次序列:0,1,2,3,#,#,4,#,5,6,#
輸出先序序列:0,1,3,#,5,#,#,#,2,#,4,6,#,#,#
我的輸出最後多個,號,但是思路是這樣,反序列化二叉樹,然後序列化二叉樹
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
TreeNode* CreateTree(string &str)//層次遍歷建立二叉樹
{
int num = 0;
vector<TreeNode *>tmp;
int i;
for (i = 0; i < str.length();)
{
if (str[i] == ',')
i++;
else
if (str[i] == '#')
{
tmp.push_back(NULL);
i++;
num++;
}
else
{
int x = 0;
while (str[i] != ','&&i<str.length())
{
x = x * 10 + str[i] - '0';
i++;
}
TreeNode *node = new TreeNode(x);
tmp.push_back(node);
num++;
}
}
int q = 0;//設置BFS層次一個一個處理結點
int p = 1;//設置每一棵樹得左子樹。
while (q < num)
{
if (tmp[q] == NULL)
q++;
else
{
if (p < num)
tmp[q]->left = tmp[p];
if (p + 1 < num)
tmp[q]->right = tmp[p + 1];
p = p + 2;
q++;
}
}
return tmp[0];
}
void PreTree(TreeNode *root)//先序排列
{
if (root == NULL)
{
cout << "#" << ",";
return;
}
cout << root->val << ",";
PreTree(root->left);
PreTree(root->right);
}
int main()
{
string str;
cin >> str;
if (str == "")
return 0;
TreeNode *root = CreateTree(str);
PreTree(root);
return 0;
}