力扣-513 找树左下角的值

给定一棵二叉树的根节点root,返回该二叉树最顶层,最左边的值,假定二叉树至少有一个节点。

本题使用迭代法的话,思路很简单,只需要使用层序遍历,并记录每层第一个节点即可,实现方法也很简单,代码如下:

int findBottomLeftValue(TreeNode* root) {
    //迭代法--层序遍历
    //使用队列来保存每一层的节点
    queue<TreeNode*> que;
    if(root != nullptr) que.push(root);
    int result = 0;
    while(!que.empty()){
        //size确保每次节点出队列的个数不会错
        int size = que.size();
        for(int i =0;i<size;i++){
            TreeNode* node = que.front();
            que.pop();
            if(i == 0) result = node->val;
            //处理左右子树
            if(node->left) que.push(node->left);
            if(node->right) que.push(node->right);
        }
    }
    return result;
}

利用层序遍历来处理是最简单的,但我们也可以使用递归法来处理,我们知道,二叉树的最后一行,应该是深度最大的叶子节点所在的一行,因此,我们需要找到深度最大,且在左边的叶子节点,因此,在遍历树的过程中,只要保证先左边后右边即可,这样的话,前、中、后序都是可以实现的

递归三部曲:

  1. 确定递归函数的参数和返回值

参数首先要有根节点,然后我们还需要一个变量来记录当前深度,方便和最大深度比较,也需要一个变量来记录最大深度

int maxDepth = INT_MIN;//全局变量,用来记录最大深度
int result;//全局变量,用来记录每一个深度下最左边的值
void traversal(TreeNode* root,int depth)
  1. 确定终止条件

在节点为空的时候处理没有意义,因此,当我们遇到叶子节点的时候,就要更新最大深度并保存该深度下最左边的值

if(root->left == nullptr && root->right == nullptr){
    if(depth > maxDepth){
        maxDepth = depth;
        result = root->val;
    }
    return;
}
  1. 确定单层递归逻辑

我们按顺序处理左右子树即可,但是要注意,在处理左右子树时,我们需要回溯

if(root->left){
    depth++;//代表我们进入了下一个深度
    traversal(root->left,depth);
    depth--;//处理完下一个深度后,我们需要回溯到上一个深度层,才可以处理另一边的子树
}
if(root->right){
    depth++;
    traversal(root->right,depth);
    depth--;
}

所以,完整代码如下:

int maxDepth = INT_MIN;
    int result;
    void traversal(TreeNode* root,int depth){
        if(root->left == nullptr && root->right == nullptr){
            if(depth > maxDepth){
                maxDepth = depth;
                result = root->val;
            }
        }
        if(root->left){
            depth++;
            traversal(root->left,depth);
            depth--;//回溯处理
        }
        if(root->right){
            depth++;
            traversal(root->right,depth);
            depth--;//回溯处理
        }
}

我们只需要调用该函数,最后result即为结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值