一. 深信服2020编程第一题. 题目大意是从层次遍历序列得到前序遍历序列...一开始看得有些懵..现在来总结一下.
(因为我自己定义输入输出,所以就没有原题那么严格了.........)
二叉树的序列化
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//层次遍历构造树,用队列.
TreeNode* generateTree(queue<char> list) {
if (list.front() == '#') return NULL;
//队列里存的都是树节点.
queue<TreeNode*> tmp;
TreeNode* root = new TreeNode(list.front() - '0');
//tmp存放需要广度优先遍历的节点...
tmp.push(root);list.pop();
//list为空说明包括#都没了,才算结束.
while (!list.empty()) {
//取出节点.
TreeNode* node = tmp.front();
tmp.pop();
//不等于#则构建左节点.
if (list.front() != '#') {
node->left = new TreeNode(list.front() - '0');
tmp.push(node->left); list.pop();
}
else list.pop();
//接着构建右子树节点.
if (list.front() != '#') {
node->right = new TreeNode(list.front() - '0');
tmp.push(node->right); list.pop();
}
else list.pop();
}
return root;
}
//通过树递归进行先序遍历.
void preorder(TreeNode* root, vector<int>& res) {
if (root == NULL) {
res.push_back(-1);
return;
}
res.push_back(root->val);
preorder(root->left, res);
preorder(root->right, res);
}
int main() {
queue<char> list;
list.push('0'); list.push('1'); list.push('2'); list.push('3');
list.push('#'); list.push('#'); list.push('4'); list.push('#');
list.push('5'); list.push('6'); list.push('#');
TreeNode* root = generateTree(list);
vector<int> res;
preorder(root, res);
for (int i = 0; i < res.size(); i++)
cout << res[i] << endl;
cin.get();
return 0;
}