根据先序和中序构建二叉树,然后进行层序遍历,记录每一层的最右边的节点数据,即为右视图。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型vector 先序遍历 * @param zhongxu int整型vector 中序遍历 * @return int整型vector */ TreeNode* reconstruction(vector<int> &pre, int pl, int pr, vector<int> &mid, int ml, int mr) { TreeNode* res = new TreeNode(pre[pl]); // 前序遍历第一个为父节点 int father = ml - 1; while (pre[pl] != mid[++father]) { // do nothing //找到中序遍历中父节点的位置 } if (father > ml) { //有左子节点的情况下,左子节点指针指向递归构建的新节点 res->left = reconstruction(pre, pl + 1, pl + father - ml, mid, ml, father - 1); } if (father < mr) { //有右子节点的情况下,右子节点指针指向递归构建的新节点 res->right = reconstruction(pre, pl + father - ml + 1, pr, mid, father + 1, mr); } return res; } vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { // write code here // 层序遍历, 记录每一层的最后一个数据 vector<int> ans; if (xianxu.empty()) return ans; TreeNode* tree = reconstruction(xianxu, 0, xianxu.size()-1, zhongxu, 0, zhongxu.size()-1); queue<TreeNode*> que; que.push(tree); while (!que.empty()) { int count = que.size(); while (count--) { if (que.front()->left) que.push(que.front()->left); if (que.front()->right) que.push(que.front()->right); if (!count) ans.push_back(que.front()->val); // 记录每一层最后一个数据 que.pop(); } } return ans; } };