1 问题
给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:
示例 2:
2 解法
2.1 迭代法
因为要求最后一层的最左侧元素,使用层序遍历。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
//题中已给树的根节点不为null,故无需判断root
queue<TreeNode*> que;
que.push(root);
int leftVal = 0;
while(!que.empty())
{
int size = que.size();
for(int i = 0; i < size; i++)
{
TreeNode* node = que.front();
que.pop();
//记录每行第一个元素,由于每层遍历,leftVal都会被下一层的最左值覆盖,因此循环结束为最后一行的最左值。
if(i == 0) leftVal = node->val;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return leftVal;
}
};
2.2 递归法
如果需要遍历整颗树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//记录树的最大深度
int maxDepth = INT_MIN;
//记录最左侧值
int leftVal;
void traversal(TreeNode* node, int depth)
{
//遍历到叶子节点,递归终止,记录最左边值与当前深度
if(node->left == nullptr && node->right == nullptr)
{
//此时是最后行
if(depth > maxDepth)
{
maxDepth = depth;
leftVal = node->val;
}
}
//遍历左子树
if(node->left)
{
depth++;
traversal(node->left, depth);
depth--; //回溯
}
if(node->right)
{
depth++;
traversal(node->right, depth);
depth--;
}
}
int findBottomLeftValue(TreeNode* root) {
traversal(root, 0);
return leftVal;
}
};