You need to find the largest value in each row of a binary tree.
Example:
Input: 1 / \ 3 2 / \ \ 5 3 9 Output: [1, 3, 9]
TreeNode
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
返回一个向量,包含二叉树的每一层的最大值。由于二叉树树结构的特殊性,广度优先搜索是进行层次遍历的好方法。由于第一层只有根节点,将根节点的值放入向量之中。每个节点需要一个dist值保存离根节点的距离(所在深度)。在不改变预先定义好的Treenode结构的前提下,将每个节点的val与向量的该层最大值比较后,可以将该节点的val改2为dist值。这样,我们就可以根据父节点的val值(实际上是dist),推断儿子节点的深度,然后与该深度的最大值比较后,同样将val值改为dist。
code
#include <iostream>
#include <queue>
using namespace std;
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
vector<int> max_per_level;
queue<TreeNode*> q;
if (root==NULL) return max_per_level;
max_per_level.push_back(root->val);
root->val=0;
q.push(root);
while (!q.empty()) {
TreeNode* u=q.front();
q.pop();
if (u->left) {
int val = u->left->val;
int dist=u->val+1;
if (dist >= max_per_level.size())
max_per_level.push_back(val);
else if (max_per_level[dist] < val)
max_per_level[dist]=val;
u->left->val=dist;
q.push(u->left);
}
if (u->right) {
int val = u->right->val;
int dist=u->val+1;
if (dist >= max_per_level.size())
max_per_level.push_back(val);
else if (max_per_level[dist] < val)
max_per_level[dist]=val;
u->right->val=dist;
q.push(u->right);
}
}
return max_per_level;
}
};