每日一练:LeeCode-513、找树左下角的值【二叉树】

本文是力扣LeeCode-513、找树左下角的值 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。

示例 1:
每日一练:LeeCode-513、找树左下角的值【二叉树】_第1张图片

输入: root = [2,1,3]
输出: 1

示例 2:
每日一练:LeeCode-513、找树左下角的值【二叉树】_第2张图片

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

提示:
二叉树的节点个数的范围是 [1,10^4]
-2^31 <= Node.val <= 2^31 - 1

思路

递归法

题⽬:在树的最后⼀⾏找到最左边的值
使⽤递归法如何判断是最后⼀⾏呢,其实就是深度最⼤的叶⼦节点⼀定是最后⼀⾏

找深度最⼤、找最左边的叶⼦节点
可以使⽤前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左 优先就⾏),保证优先左边搜索,然后记录深度最⼤的叶⼦节点,此时就是树的最后⼀⾏最左边的值

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

		int maxDepth = Integer.MIN_VALUE;	// 全局变量 记录最⼤深度
		int result;
		getLeftDownVal(TreeNode cur,int depth)

2. 确定终⽌条件
遇到叶⼦节点来更新最⼤深度

        if(cur.left==null&&cur.right==null){
            if(depth>maxDepth){
                maxDepth=depth;	// 更新最⼤深度
                result = cur.val;	// 最⼤深度最左⾯的数值
            }
            return;
        }
  1. 确定单层递归的逻辑
    注:找最⼤深度的时候,递归的过程中依然要使⽤回溯
        if(cur.left!=null){
            depth++;
            getLeftDownVal(cur.left,depth);
            depth--;
        }

        if(cur.right!=null){
            depth++;
            getLeftDownVal(cur.right,depth);
            depth--;
        }
        return;
整体代码
class Solution {
    int maxDepth = Integer.MIN_VALUE;
    int result;

    public int findBottomLeftValue(TreeNode root) {
        getLeftDownVal(root,0);
        return result;
    }/*  */

    void getLeftDownVal(TreeNode cur,int depth){

        if(cur.left==null&&cur.right==null){
            if(depth>maxDepth){
                maxDepth=depth;
                result = cur.val;
            }
            return;
        }
        if(cur.left!=null){
            depth++;
            getLeftDownVal(cur.left,depth);
            depth--;
        }

        if(cur.right!=null){
            depth++;
            getLeftDownVal(cur.right,depth);
            depth--;
        }
        return;
    }
}

层序遍历(省略)

套个层序遍历模版就可以解决了,可以参考本人层序遍历博客

最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢

你可能感兴趣的:(#,每日一道LeeCode算法题,算法,数据结构,leetcode)