class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型vector 先序遍历 * @param inOrder int整型vector 中序遍历 * @return int整型vector */ TreeNode* build( const vector& pre, int preL, int preR, const vector& in, int inL, int inR) { if (preL > preR || inL > inR) return nullptr; TreeNode* root = new TreeNode(pre[preL]); int Search = find(in.begin() + inL, in.begin() + inR + 1, pre[preL]) - in.begin(); int k = Search - inL; // 左子树节点数 root->left = build( pre, preL + 1, preL + k, in, inL, Search - 1 ); root->right = build( pre, preL + k + 1, preR, in, Search + 1, inR ); return root; } vector solve(vector& preOrder, vector& inOrder) { TreeNode* root = build( preOrder, 0, preOrder.size() - 1, inOrder, 0, inOrder.size() - 1 ); vector result; if (!root) return result; queue q; q.push(root); while (!q.empty()) { int sz = q.size(); // 当前层节点数 for (int i = 0; i < sz; i++) { TreeNode* t = q.front(); q.pop(); // 当前层最后一个节点 if (i == sz - 1) { result.push_back(t->val); } if (t->left) q.push(t->left); if (t->right) q.push(t->right); } } return result; } };