Problem:
Given a binary tree, find the leftmost value in the last row of the tree.
Example 1:
Input: 2 / \ 1 3 Output: 1
Example 2:
Input: 1 / \ 2 3 / / \ 4 5 6 / 7 Output: 7
Note: You may assume the tree (i.e., the given root node) is not NULL.
Solution:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void findBottomLeftValue(TreeNode* root, int& leftVal, int& maxDepth, int curDepth) {
if (root == NULL) {
return;
}
findBottomLeftValue(root->left, leftVal, maxDepth, curDepth+1);
findBottomLeftValue(root->right, leftVal, maxDepth, curDepth+1);
if (curDepth > maxDepth) {
maxDepth = curDepth;
leftVal = root->val;
}
}
int findBottomLeftValue(TreeNode* root) {
int leftVal = root->val;
int maxDepth = 0;
findBottomLeftValue(root, leftVal, maxDepth, 0);
return leftVal;
}
};
关键点分析:根据题意,可以联想到用深度优先算法解决此题,先扫描左子树的节点,再找右子树节点,这里有一个
容易误解的地方,题意并不是单纯要求我们找到处于最左的节点,而是最底层的并且处于最左位置的节点,因此在递
归时要注意跟踪当前的深度,这里我使用curDepth来记录当前的深度(初始值为0),使用maxDepth来记录当前
到达的最大深度,当curDepth > maxDepth时说明还能往树的更深处找值,因此要更新maxDepth的值(特别注意:
maxDepth一定要使用引用类型)
本题也可用广度优先搜索来解,具体参考:https://discuss.leetcode.com/topic/78940/c-bfs-solution