深信服2019秋招筆試題層次遍歷建立二叉樹

/*
本以爲樹開始覺得差不多了,就是個遞歸或者用隊列,沒想到筆試居然要用層次遍歷建立二叉樹,然後按前序遍歷輸出,以前建樹都是遞歸。所以這道題就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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章