题目要求找出二叉树的最底层的最左侧的叶节点。
思路:
1、要找最底层节点,考虑使用DFS,并且先访问左子树再访问右子树。
2、我们要需要记录叶子节点的深度,一边进行比较,用深度作为返回值,每次dfs都能得到每个节点的左右子树的深度,同时用引用的方式记录叶子节点的数值。
3、最后,比较深度,如果深度相同,返回左子树的叶节点,否则返回深度大的叶节点。
递归的条件:首先
class Solution {
public:int findBottomLeftValue(TreeNode* root) {
int val = 0;
dfs(root, 0, val);
return val;
}
int dfs(TreeNode *node, int level, int &val)
{
if(NULL == node)
{
return level-1;
}
int l = 0;
int r = 0;
int left_val = 0;
int right_val = 0;
val = node->val;
l = dfs(node->left, level+1, val);
left_val = val;
val = node->val;
r = dfs(node->right, level+1, val);
right_val = val;
val = l>=r ? left_val:right_val;
return max(l, r); //每次都要返回最深的那个深度。作为dfs的返回值
}
大佬的简洁解法:
class Solution {
public:
int res=0; //记录结果
int height=0; //记录深度
int findBottomLeftValue(TreeNode* root) {
if(root==NULL) return -1;
dfsHelper(root, 1);
return res;
}
private:
void dfsHelper(TreeNode* node, int depth)
{
if(node==NULL) return;
if(height < depth) {
res = node->val;
height = depth;
}
dfsHelper(node->left, depth+1);
dfsHelper(node->right, depth+1);
}
};