【代码随想录训练营】【Day18】第六章|二叉树|513.找树左下角的值|112. 路径总和|113.路径总和ii|105.从前序与中序遍历序列构造二叉树|106.从中序与后序遍历序列构造二叉树

找树左下角的值

题目详细:LeetCode.513

由题可知:找出该二叉树的最底层、最左边节点的值

  • 最底层:节点所处的深度最深
  • 最左边:统一深度的节点,优先取最左边的节点

因此,我们只要找到满足这两个条件的节点就是树的左下角的节点,难点在于如何找?

  • 找最底层:定义一个变量,用于记录遍历到的节点的深度,以此来确定当前节点是不是最底层的节点
  • 找最左边:优先找最左边的节点,那么在访问子节点时,左节点要优先于右节点被访问,所以这道题可以使用多种不同的遍历方式,如前序、后序等等,只要保证左节点优先被访问就行。

这道题使用迭代的方式,比递归要清晰易懂些。

既然我们要找最底层、最左边的节点,那么层序遍历从上到下、从左到右的特点毫无疑问满足了我们所有的需求,只需要在遍历过程中,一直记录每一层最先访问的节点,那么当树遍历完时,返回记录的节点即是树左小角的值。

Java解法(迭代、层序遍历):

class Solution {
   
    public int findBottomLeftValue(TreeNode root) {
   
        return this.bfd(root);
    }

    public int bfd(TreeNode root){
   
        Queue<TreeNode> queue = new LinkedList<>();
        if(null != root) queue.offer(root);
        int leftNum = 0;
        while(!queue.isEmpty()){
   
            int n = queue.size();
            boolean f_switch = true;
            while(n-- > 0){
   
                TreeNode node = queue.poll();
                // 每一层从左到右访问,所以每一层最先访问的节点就是最左边的节点
                if(f_switch){
   
                    leftNum = node.val;
                    f_switch = false;
                }
                if(null != node.left) queue.offer(node.left);
                if(null != node.right) queue.offer(node.right);
            }
        }
        return leftNum;
    }
}

也可以使用递归,不过我们需要改动一下代码:

  • 在递归函数中增加一个深度参数,记录当前节点的深度,在遍历过程中比较节点的深度,保证节点位于最底层的特点
  • 采用前序遍历(或后序遍历),使每一次递归都优先访问左节点,保证节点位于最左边的特点
  • 优化:因为最底层的节点一定是叶子节点,所以我们可以在遍历到叶子节点时,再比较已遍历的最大深度和当前节点的深度,以此来判断该叶子节点是否为最底层的节点。

Java解法(递归,前序遍历):

class Solution {
   
    public int maxDepth = 0;
    public int ans = 0;

    public int findBottomLeftValue(TreeNode root) {
   
        this.dfs(root, 1);
        return this.ans;
    }

    public void dfs(TreeNode root, int depth){
   
        if(null == root) return;
        if(null == root.left && null == root.right){
   
            if(depth > this.maxDepth){
   
                this.ans = root.val;
                this.maxDepth = depth;
            }
        }
        if(null != root.left) this.dfs(root.left, depth + 1);
        if(null != root.right) this.dfs(root.right, depth + 1);
    }
}

路径总和

题目详细:LeetCode.112

由题可知:只要求判断树中是否能够找到一条路径总和满足目标值的路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值