class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型vector 先序遍历 * @param zhongxu int整型vector 中序遍历 * @return int整型vector */ // struct TreeNode{ // int val; // TreeNode * left; // TreeNode * right; // }; vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { // write code here queue<TreeNode*> q; int n = xianxu.size(); // vector<int> res; // TreeNode* root = buildTree(xianxu,zhongxu, 0, n-1, 0, n-1); // if(root == NULL) return res; // q.push(root); // while(!q.empty()) // { // int m = q.size(); // res.push_back(q.back()->val); // for(int i = 0; i < m; i++) // { // TreeNode* n = q.front(); // if(n->left != NULL) q.push(n->left); // if(n->right!= NULL) q.push(n->right); // q.pop(); // } // } getRightView(xianxu,zhongxu, 0, n-1, 0, n-1,0); return res2; } // TreeNode * buildTree(vector<int>& pre, vector<int>& in, int pre_start, int pre_end, int in_start, int in_end) // { // if(pre_start > pre_end) return NULL; // int key = pre[pre_start]; // TreeNode* curr = new TreeNode(); // curr->val = key; // int i = in_start; // while(in[i] != key) i++; // int l_left = i-in_start, l_right = in_end - i; // curr->left = buildTree(pre,in,pre_start+1,l_left+pre_start,in_start,i-1); // curr->right = buildTree(pre,in,l_left+pre_start+1,pre_end,i+1,in_end); // return curr; // } void getRightView(vector<int>& pre, vector<int>& in, int pre_start, int pre_end, int in_start, int in_end, int level) { if(pre_start > pre_end) return; int key = pre[pre_start]; if(level == res2.size()) res2.push_back(key); int i = in_start; while(in[i] != key) i++; int l_left = i-in_start, l_right = in_end - i; getRightView(pre,in,l_left+pre_start+1,pre_end,i+1,in_end,level+1); getRightView(pre,in,pre_start+1,l_left+pre_start,in_start,i-1,level+1); } private: vector<int> res2; };