题解 | #输出二叉树的右视图#
输出二叉树的右视图
https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
最捞的一集,分步骤求解😅求右视图用逆序的层序遍历,可以节省一点时间。
#include <cstddef> class Solution { public: bool areAllEmpty(const vector<TreeNode*>& vec) { for (int i = 0; i < vec.size(); i++) { if (vec[i]) return false; } return true; } TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) { if (preOrder.empty() || vinOrder.empty()) return NULL; TreeNode* root = new TreeNode(preOrder[0]); int i; for (i = 0; i < vinOrder.size(); i++) { if (vinOrder[i] == root->val) break; } if (i) { vector<int> leftpre(preOrder.begin() + 1, preOrder.begin() + i + 1); vector<int> leftvin(vinOrder.begin(), vinOrder.begin() + i); root->left = reConstructBinaryTree(leftpre, leftvin); } else { root->left = NULL; } if (i < vinOrder.size() - 1) { vector<int> rightpre(preOrder.begin() + i + 1, preOrder.end()); vector<int> rightvin(vinOrder.begin() + i + 1, vinOrder.end()); root->right = reConstructBinaryTree(rightpre, rightvin); } else { root->right = NULL; } return root; } vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) { TreeNode* root = reConstructBinaryTree(preOrder, inOrder); vector<int> res; if (!root) return res; vector<TreeNode*> query; query.push_back(root); TreeNode* tmp; int depth = 0; while (!query.empty()) { if (areAllEmpty(query)) break; if (query.size() == pow(2, depth)) { for (int i = 0; i < query.size(); i++) { if (query[i] != NULL) { res.push_back(query[i]->val); break; } } depth++; } tmp = query[0]; if (tmp) { query.push_back(tmp->right); query.push_back(tmp->left); } else { query.push_back(nullptr); query.push_back(nullptr); } query.erase(query.begin()); } return res; } };