https://leetcode.com/problems/find-largest-value-in-each-tree-row/description/
Solution 1. Recursion.
void levelOrder(TreeNode* node, vector<int>& res, int lev) {
if(!node) return;
if(res.size() == lev) res.push_back(node->val);
else
res[lev] = res[lev] > node->val ? res[lev] : node->val;
levelOrder(node->left, res, lev+1);
levelOrder(node->right, res, lev+1);
}
vector<int> largestValues(TreeNode* root) {
vector<int> res;
levelOrder(root, res, 0);
return res;
}
Solution 2.
vector<int> largestValues(TreeNode* root) {
vector<int> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
q.push(nullptr);
int mx = INT_MIN;
while(!q.empty()) {
TreeNode* node = q.front();
q.pop();
if(node == nullptr) {
res.push_back(mx);
mx = INT_MIN;
if(!q.empty())
q.push(nullptr);
}
else {
mx = mx>node->val ? mx : node->val;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return res;
}
Showing posts with label LevelOrder. Show all posts
Showing posts with label LevelOrder. Show all posts
Thursday, September 28, 2017
Wednesday, September 27, 2017
513. Find Bottom Left Tree Value
https://leetcode.com/problems/find-bottom-left-tree-value/description/
Solution 1
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
q.push(nullptr);
int res;
TreeNode* last = nullptr;
while(q.size()>1) {
if(last == nullptr) res = q.front()->val;
last = q.front();
q.pop();
if(last == nullptr) {
q.push(nullptr);
}
else {
if(last->left) q.push(last->left);
if(last->right) q.push(last->right);
}
}
return res;
}
Solution 2. Recursion
void findLeft(TreeNode* node, int& mx, int& maxDep, int dep) {
if(!node) return;
if(maxDep < dep) {
maxDep = dep;
mx = node->val;
}
findLeft(node->left, mx, maxDep, dep+1);
findLeft(node->right, mx, maxDep, dep+1);
}
int findBottomLeftValue(TreeNode* root) {
int mx = root->val, maxDep = 0;
findLeft(root, mx, maxDep, 0);
return mx;
}
Solution 1
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
q.push(nullptr);
int res;
TreeNode* last = nullptr;
while(q.size()>1) {
if(last == nullptr) res = q.front()->val;
last = q.front();
q.pop();
if(last == nullptr) {
q.push(nullptr);
}
else {
if(last->left) q.push(last->left);
if(last->right) q.push(last->right);
}
}
return res;
}
Solution 2. Recursion
void findLeft(TreeNode* node, int& mx, int& maxDep, int dep) {
if(!node) return;
if(maxDep < dep) {
maxDep = dep;
mx = node->val;
}
findLeft(node->left, mx, maxDep, dep+1);
findLeft(node->right, mx, maxDep, dep+1);
}
int findBottomLeftValue(TreeNode* root) {
int mx = root->val, maxDep = 0;
findLeft(root, mx, maxDep, 0);
return mx;
}
Thursday, August 31, 2017
107. Binary Tree Level Order Traversal II
https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description/
Solution 1. Recursive level traversal. Need to add a {} to res to increase res.size() when starting a new level, otherwise res[level] causes index error.
void levelOrder(TreeNode* node, vector<vector<int>>& res, int level) {
if(!node) return;
if(level == res.size()) res.push_back({});
res[level].push_back(node->val);
levelOrder(node->left, res, level+1);
levelOrder(node->right, res, level+1);
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
levelOrder(root, res, 0);
reverse(res.begin(), res.end());
return res;
}
Solution 2. Push each level to a queue. Use nullptr as a separator between levels.
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
TreeNode* node;
q.push(root);
q.push(nullptr);
while(!q.empty()) {
vector<int> level;
while(node = q.front()){
q.pop();
level.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
q.pop();
q.push(nullptr);
if(level.empty()) break;
res.insert(res.begin(),level);
}
return res;
}
Solution 1. Recursive level traversal. Need to add a {} to res to increase res.size() when starting a new level, otherwise res[level] causes index error.
void levelOrder(TreeNode* node, vector<vector<int>>& res, int level) {
if(!node) return;
if(level == res.size()) res.push_back({});
res[level].push_back(node->val);
levelOrder(node->left, res, level+1);
levelOrder(node->right, res, level+1);
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
levelOrder(root, res, 0);
reverse(res.begin(), res.end());
return res;
}
Solution 2. Push each level to a queue. Use nullptr as a separator between levels.
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
TreeNode* node;
q.push(root);
q.push(nullptr);
while(!q.empty()) {
vector<int> level;
while(node = q.front()){
q.pop();
level.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
q.pop();
q.push(nullptr);
if(level.empty()) break;
res.insert(res.begin(),level);
}
return res;
}
Subscribe to:
Posts (Atom)