#include <queue>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
TreeNode* buildTree(vector<int>& pre, vector<int>& vin) {
int pre_size = pre.size();
int vin_size = vin.size();
if (pre_size == 0 || vin_size == 0)
return nullptr;
TreeNode* root = new TreeNode(pre[0]);
for (int i = 0; i < vin_size; i++) {
if (pre[0] == vin[i]) {
//左子树先序
vector<int > leftpre(pre.begin() + 1, pre.begin() + 1 + i);
//左子树中序
vector<int > leftvin(vin.begin(), vin.begin() + i);
//左孩子
root->left = buildTree(leftpre, leftvin);
//右子树先序
vector<int > rightpre(pre.begin() + i + 1, pre.end());
//右子树先序
vector<int > rightvin(vin.begin() + i + 1, vin.end());
//右孩子
root->right = buildTree(rightpre, rightvin);
break;
}
}
return root;
}
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
// write code here
TreeNode* root = buildTree(xianxu, zhongxu);
vector<int > rightview = {};
if (xianxu.size() == 0 || zhongxu.size() == 0) {
return rightview;
}
queue<TreeNode *> qu;
qu.push(root);
bool isRight = true;
while (!qu.empty()) {
int size = qu.size();
isRight = true;
while (size--) {
TreeNode* node = qu.front();
qu.pop();
if (isRight) {
rightview.push_back(node->val);
isRight = false;
}
if (node->right) {
qu.push(node->right);
}
if (node->left) {
qu.push(node->left);
}
}
}
return rightview;
}
};