在建立好二叉树之后进行前序遍历,当然,此处需要遵循RL的顺序进行,每一层只有一个结点被看见,因此利用map映射进行标识。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
TreeNode* Build(TreeNode* root,vector<int> pre,vector<int> vin,int s1,int e1,int s2,int e2){
if(s1 > e1 || s2 > e2)
return NULL;
if(root == NULL){
root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = pre[s1];
root->left = NULL;
root->right = NULL;
}
int num = pre[s1],pos = 0;
for(int i = s2;i <= e2;++i){
if(vin[i] == num){
pos = i;
break;
}
}
root->left = Build(root->left,pre,vin,s1 + 1,s1 + pos - s2,s2,pos - 1);
root->right = Build(root->right,pre,vin,s1 + pos - s2 + 1,e1,pos + 1,e2);
return root;
}
vector<int> ans;
map<int,int> mp;
void predfs(TreeNode* root,int level){
if(root == NULL)
return ;
if(mp.find(level) == mp.end()){
mp[level] = 1;
ans.push_back(root->val);
}
predfs(root->right,level + 1);
predfs(root->left,level + 1);
}
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
TreeNode* root = NULL;
root = Build(root,xianxu,zhongxu,0,xianxu.size() - 1,0,zhongxu.size() - 1);
predfs(root,0);
return ans;
}
};