题目说明
这是leetcode上面的一道中等算法题:https://leetcode.com/problems/find-bottom-left-tree-value/description/
说明如下:
Given a binary tree, find the leftmost value in the last row of the tree.
找到位于二叉树最底层最左边的元素的值。
示例:
Input:
1
/ \
2 3
/ / \
4 5 6
/
7
Output:
7
解题思路
这道题其实是求二叉树深度的变形题。我的思路是在遍历的时候进行计数,每访问一个节点level+1,之后将最大深度depth与当前深度level比较,如果depth小于level,则将当前节点的值赋给result。因为我们需要得到的是最左的元素,所以采取先左后右的遍历方法,这样便可以保证在遍历新的一层的时候,第一个遍历到的节点一定是最左边的节点。
代码实现
C++
/**
* 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:
int findBottomLeftValue(TreeNode* root) {
int depth = 0;
int result = root->val;
visitNode(root, 0, depth, result);
return result;
}
void visitNode(TreeNode* pNode, int level, int &depth, int& result) {
level++;
if (depth < level) {
result = pNode->val;
depth = level;
}
if (pNode->left) {
visitNode(pNode->left, level, depth, result);
}
if (pNode->right) {
visitNode(pNode->right, level, depth, result);
}
}
};
反思
我的visitNode函数传入了四个参数用于计算当前深度、最大深度和返回结果,但是感觉太过冗余。之后我会尝试通过返回值方法或者while循环来简化函数。
如果你有什么更简洁高效的想法也可以在留言里留言,大家一起讨论学习。