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]
题目要求输出一颗二叉树每一行的最大值。
思路:使用dfs策略,需要记录当前的深度,然后不断更新每一层的数值使之最大化。
我的代码:
class Solution {
public:
vector<int> vec;
vector<int> largestValues(TreeNode* root) {
dfs(root, 1);
return vec;
}
void dfs(TreeNode* node, int level)
{
if(node == NULL)
{
return;
}
if(vec.size()<level) //如果dfs到新的层
{
vec.push_back(node->val);
}
int l = INT_MIN; //记录左儿子的数值
int r = INT_MIN; //记录右儿子的数值
if(node->left != NULL)
{
dfs(node->left, level+1); //dfs左子树
l = node->left->val;
}
if(node->right != NULL)
{
dfs(node->right, level+1); //dfs右子树
r = node->right->val;
}
vec[level] = max(max(l, r), vec[level]);
}
};
大佬代码:
class Solution {
public:
vector<int> vec;
vector<int> largestValues(TreeNode* root) {
dfs(root, 0);
return vec;
}
void dfs(TreeNode* node, int level)
{
if (!node)
return;
if (level == vec.size()) //dfs到新的层
vec.push_back(node->val);
if (node->val > vec[level]) //巧妙!先比较当前节点的值和当前层的数值。
vec[level] = node->val;
dfs(node->left, level+1);
dfs(node->right, level+1);
}
};
总结,跟大佬的思路是一样的,但是写出来的代码截然不同。代码的编写差距比较大,我是先得到左右子树的儿子的数值,再进行比较,大佬是先比较,实际上根本没必要考虑左右儿子是否为空,因为当前层只要有数值,就可以比较,因此,先进行比较并更新的代码更简洁易读!代码层面要多实践,将思路转化为简洁易懂的代码!