先重构二叉树,后层次遍历。
class Solution {
public:
unordered_map<int, int> index;
TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right,vector<int>& in, int in_left, int in_right)
{
if (pre_left > pre_right)
return nullptr;
int root_val = pre[pre_left];
int in_root = index[root_val];
TreeNode* root = new TreeNode(root_val);
int size_left_subtree = in_root - in_left;
root->left = rebuild(pre, pre_left + 1, pre_left + size_left_subtree, in, in_left, in_root - 1);
root->right = rebuild(pre, pre_left + size_left_subtree + 1, pre_right, in, in_root + 1, in_right);
return root;
}
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
int n = xianxu.size();
vector<int> vec;
if(n == 0) return vec;
for (int i = 0; i < n; i++)
index[zhongxu[i]] = i;
TreeNode* root = rebuild(xianxu, 0, n - 1, zhongxu, 0, n - 1);
queue<TreeNode*> que;
que.push(root);
while(!que.empty())
{
int len = que.size();
for(int i = 0; i < len; i++)
{
if(i == len - 1)
vec.push_back(que.front()->val);
if(que.front()->left != nullptr) que.push(que.front()->left);
if(que.front()->right != nullptr) que.push(que.front()->right);
que.pop();
}
}
return vec;
}
};


京公网安备 11010502036488号