建树在二叉树的还原做过了。然后是右视图,采用层次遍历,每次取最后的数字压入数组。实际算法还可以优化,这里就先这样吧。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型vector 先序遍历 * @param zhongxu int整型vector 中序遍历 * @return int整型vector */ vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { if (xianxu.empty() || zhongxu.empty()) { return std::vector<int>(); } TreeNode *root = restruct(xianxu, zhongxu); std::vector<int> res; std::queue<TreeNode *> tree; // bool stop_flag = false; tree.push(root); res.push_back(root->val); while (!tree.empty()) { int size = tree.size(); int val; for (int i = 0; i < size; ++i) { TreeNode *cur = tree.front(); tree.pop(); if (cur->left) { val = cur->left->val; tree.push(cur->left); } if (cur->right) { val = cur->right->val; tree.push(cur->right); } } if (val != *(res.end() - 1)) { res.push_back(val); } } return res; } private: TreeNode* restruct(const std::vector<int> &xianxu, const std::vector<int> &zhongxu) { if (xianxu.empty()) { return nullptr; } TreeNode *root = new TreeNode(xianxu[0]); auto p_fir = xianxu.begin(); auto p_ord = zhongxu.begin(); while (*p_ord != *p_fir) { ++p_ord; } p_fir = p_fir + (p_ord - zhongxu.begin()) + 1; root->left = restruct(std::vector<int>(xianxu.begin() + 1, p_fir), std::vector<int>(zhongxu.begin(), p_ord)); root->right = restruct(std::vector<int>(p_fir, xianxu.end()), std::vector<int>(p_ord + 1, zhongxu.end())); return root; } };