class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型vector 先序遍历 * @param inOrder int整型vector 中序遍历 * @return int整型vector */ void buildOrder(vector<int>& primeVec,map<int,int>& result){ for(int i=0;i<primeVec.size();++i){ result[primeVec[i]]=i; } } TreeNode* buildTree(int root,int left,int right,map<int,int>& preOrderMap,map<int,int>& inOrderMap,vector<int>& preOrder, vector<int>& inOrder){ //cout<<"建造"<<root<<' '<<left<<' '<<right<<endl; //cout<<"左子树大小"<<inOrderMap[root]- inOrderMap[left]<<endl; TreeNode *curRoot=new TreeNode(root); if(root!=left)curRoot->left=buildTree( preOrder[preOrderMap[root]+1], left, inOrder[inOrderMap[root]-1], preOrderMap,inOrderMap,preOrder,inOrder ); if(root!=right)curRoot->right=buildTree( preOrder[preOrderMap[root]+1+(inOrderMap[root]- inOrderMap[left])], inOrder[inOrderMap[root]+1], right, preOrderMap,inOrderMap,preOrder,inOrder ); return curRoot; } vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) { // write code here //右视图的含义是只输出每一层最右元素,如果给了完整的二叉树可以用层次遍历 //但是这道给的是前序遍历和中序遍历 //如果重建二叉树当然是可以做的,但我觉得一道medium题目不该用这么heavy的解法,也想不到更好的,总之先写了,就当复习 vector<int> result; if(!preOrder.size())return result; //创建索引 map<int,int> preOrderMap,inOrderMap; buildOrder(preOrder, preOrderMap); buildOrder(inOrder, inOrderMap); //构建二叉树 TreeNode *resultTree=buildTree(preOrder[0], inOrder[0],inOrder[inOrder.size()-1], preOrderMap, inOrderMap, preOrder, inOrder); //层次遍历 deque<TreeNode*> temp={resultTree}; int layerSize=1; TreeNode* cur; while(temp.size()){ cur=temp.back(); temp.pop_back(); if(cur->left)temp.push_front(cur->left); if(cur->right)temp.push_front(cur->right); --layerSize; if(!layerSize){ layerSize=temp.size(); result.push_back(cur->val); } } return result; } };