深信服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;
}

 

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