72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
class Solution {
|
|
public:
|
|
/**
|
|
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
|
|
*
|
|
* 求二叉树的右视图
|
|
* @param preOrder int整型vector 先序遍历
|
|
* @param inOrder int整型vector 中序遍历
|
|
* @return int整型vector
|
|
*/
|
|
TreeNode* build(
|
|
const vector<int>& pre, int preL, int preR,
|
|
const vector<int>& in, int inL, int inR)
|
|
{
|
|
if (preL > preR || inL > inR) return nullptr;
|
|
|
|
TreeNode* root = new TreeNode(pre[preL]);
|
|
|
|
int Search = find(in.begin() + inL, in.begin() + inR + 1, pre[preL]) - in.begin();
|
|
int k = Search - inL; // 左子树节点数
|
|
|
|
root->left = build(
|
|
pre,
|
|
preL + 1,
|
|
preL + k,
|
|
in,
|
|
inL,
|
|
Search - 1
|
|
);
|
|
|
|
root->right = build(
|
|
pre,
|
|
preL + k + 1,
|
|
preR,
|
|
in,
|
|
Search + 1,
|
|
inR
|
|
);
|
|
|
|
return root;
|
|
}
|
|
|
|
vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
|
|
TreeNode* root = build(
|
|
preOrder, 0, preOrder.size() - 1,
|
|
inOrder, 0, inOrder.size() - 1
|
|
);
|
|
|
|
vector<int> result;
|
|
if (!root) return result;
|
|
|
|
queue<TreeNode*> q;
|
|
q.push(root);
|
|
|
|
while (!q.empty()) {
|
|
int sz = q.size(); // 当前层节点数
|
|
for (int i = 0; i < sz; i++) {
|
|
TreeNode* t = q.front(); q.pop();
|
|
|
|
// 当前层最后一个节点
|
|
if (i == sz - 1) {
|
|
result.push_back(t->val);
|
|
}
|
|
|
|
if (t->left) q.push(t->left);
|
|
if (t->right) q.push(t->right);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
}; |