class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型vector 先序遍历 * @param zhongxu int整型vector 中序遍历 * @return int整型vector */ vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { // write code here TreeNode* cur; vector<vector<int>> res; cur=reConstructBinaryTree(xianxu, zhongxu); res=levelOrder(cur); vector<int> tmp; for(int i=0;i<res.size();i++){ tmp.push_back(res[i][res[i].size()-1]); } return tmp; } vector<vector<int> > levelOrder(TreeNode* root) { // write code here vector< vector<int> > res; if(root==NULL){ return res; } queue<TreeNode*> q; q.push(root); TreeNode* cur; //BFS 广度优先搜索 while(!q.empty()){ vector<int> row; int len=q.size(); for(int i=0;i<len;i++){ cur=q.front(); q.pop(); row.push_back(cur->val); if(cur->left) q.push(cur->left); if(cur->right) q.push(cur->right); } res.push_back(row); } return res; } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int len1=pre.size(); int len2=vin.size(); if(len2==0 || len1==0){ return NULL; } TreeNode* root= new TreeNode(pre[0]); for(int i=0;i<len2;i++){ //找到中序遍历第一个元素 if(pre[0]==vin[i]){ //左子树前序遍历 vector<int> leftpre(pre.begin()+1,pre.begin()+i+1); //左子树中序遍历 vector<int> leftvin(vin.begin(),vin.begin()+i); //左子树构建 root->left=reConstructBinaryTree(leftpre, leftvin); //右子树前序遍历 vector<int> rightpre(pre.begin()+i+1,pre.end()); //右子树中序遍历 vector<int> rightvin(vin.begin()+i+1,vin.end()); //右子树构建 root->right=reConstructBinaryTree(rightpre, rightvin); break; } } return root; } };