代码随想录day18|513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

文章分析了LeetCode中的两道题目,分别是513.找树左下角的值,利用队列实现;以及112.路径总和,使用递归方法。同时提到如何解决路径和问题中的递归理解误区和构建二叉树时需要注意的细节。
摘要由CSDN通过智能技术生成

leetcode513.找树左下角的值

注意:×

  1. 注意Queue这个数据结构的继承关系,LinkedList
  2. 一定一定一定!!!!!!!要注意再while循环中的第一行int sizee = queue.size();,这一行非常的重要,因为这里记录的是本轮queue的长度,如果直接使用i<queue.size();会导致queue一直在下面的for循环中直到所有元素出队列,因为i<queue.size();是不断在变化的!!!!!!!!!!
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        int res = 0;
        queue.add(root);
        while (!queue.isEmpty()){
            int sizee = queue.size();
            for (int i = 0; i<sizee;i++){
                TreeNode tmp = queue.poll();
                if (i == 0){res = tmp.val;}
                if (tmp.left!= null){queue.add(tmp.left);}
                if (tmp.right!= null){queue.add(tmp.right);}

            }
        }

        return res;
    }

leetcode112. 路径总和

注意:×

  1. 应该可以使用Labuladong说的traverse+外部变量解决,但是反复出问题,选择放弃,学习新的答案
  2. 自己写的错误1:不知道什么时候返回,当值已经是答案的时候没法跳出来,其实还是没有深刻理解递归的含义
  3. 自己的错误 2:根据列表创建二叉树需要前序+中序 或者 后序+中序,不然是没法创建的,debug还是老老实实手敲一下
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        if (root.left == null && root.right == null) {
            return sum == root.val;
        }
        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/path-sum/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    // 错错错错错错错错错错错错错错错错
    private int targetSUM;
    private int nowSUM;

    public boolean hasPathSum(TreeNode root, int targetSum) {
        targetSUM = targetSum;
        if (root == null || root.val > targetSum) {
            return false;
        }
        traverse(root);
        return nowSUM == targetSum ? true : false;
    }

    void traverse(TreeNode node) {
        if (node == null) {
            return;
        }

        nowSUM = nowSUM + node.val;
        if (nowSUM > targetSUM) {
            nowSUM = nowSUM - node.val;
            return;
        }
        if (nowSUM == targetSUM) {
            return;
        }


        traverse(node.left);
        if (nowSUM == targetSUM) {
            return;
        }
        traverse(node.right);
        if (nowSUM == targetSUM) {
            return;
        }
        nowSUM = nowSUM - node.val;
    }

leetcode106.从中序与后序遍历序列构造二叉树

注意:×

  1. 第一次写直接放弃,学习Labuladong书里面的内容
  2. 错误1:没有捋顺下标的操作
  3. 错误2:注意leftSize的使用
  4. 错误3:注意build前端判断inStart>inEnd的操作,不然会报错indexException -1
    private HashMap<Integer, Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        // 1.根据中序的内容生成<内容,下标>
        
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i], i);
        }
        
        // 2.使用build函数进行递归操作
        TreeNode root = build(inorder, 0, inorder.length-1,
                postorder, 0, postorder.length-1);
        return root;
    }

    private TreeNode build(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {
        // 这里也忘了
        if(inStart > inEnd){
            return null;
        }
        
        int rootVal = postorder[postEnd];
        int index = map.get(rootVal);
        
        TreeNode root = new TreeNode(rootVal);
        
        // 这里老是忘记
        int leftSize = index-inStart;
        
        root.left = build(inorder, inStart, index-1,
                postorder, postStart, postStart+leftSize-1);
        root.right = build(inorder, index+1, inEnd,
                postorder, postStart+leftSize, postEnd-1);
        
        return root;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值