<题目表述>
您需要在二叉树的每一行中找到最大的值。
示例:
输入:
1 / \ 3 2 / \ \ 5 3 9
输出: [1, 3, 9]
<原题链接>
https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row
<思路>
本题中每一行找最大值,我们可以考虑广度优先,即__层次遍历__。上述样例中层次遍历序列为[1,3,2,5,3,9],但我们无法确切地知道得到的数是哪一行的,也就无法进行最大值判断。现在只需要能将不同行的数分隔开即可。
这里考虑到队列的元素是指针,而堆指针是不可能分配到像如0x00000001这样特殊的地址的,那么我们不妨使用一个特殊的TreeNode*指针,让其指向这个特殊的地址,将该地址作为分隔符,这样就轻而易举地将每一行元素分隔开啦。
<样例代码>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
queue<TreeNode*> Q;
vector<int> ans;
int max = INT_MIN;
TreeNode *p = root;
TreeNode *flag = (TreeNode*)1; //分隔符,指向一个特殊的地址
Q.push(p);
Q.push(flag);
if (root == NULL)return ans;
while (!Q.empty())
{
p = Q.front(); Q.pop();
if (p == flag) //如果遇到了分隔符,那么将其放回队列中,同时将本行最大元素加入向量。
{
ans.push_back(max);
if (Q.empty())
break;
Q.push(p);
max = INT_MIN;
continue;
}
if (p->left != NULL)
Q.push(p->left);
if (p->right != NULL)
Q.push(p->right);
if (p->val > max)
max = p->val;
}
return ans;
}
};