力扣刷题笔记18|513.找树左下角的值、 112. 路径总和 、113.路径总和ii、106.从中序与后序遍历序列构造二叉树 、105.从前序与中序遍历序列构造二叉

513.找树左下角的值

1.题目:

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

假设二叉树中至少有一个节点。

示例 1:

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

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

2.思想:

3.代码:

 int res=0;
    int maxdeep=Integer.MIN_VALUE;
    public int findBottomLeftValue(TreeNode root) {
        //递归
        res=root.val;
        traversal(root,0);
        return res;
    }
    public void traversal(TreeNode root,int deep){
        if(root==null){
            return;
        }
        if(root.left==null &&root.right==null){
            if(deep>maxdeep){
               
                res=root.val;
                maxdeep=deep;
            }
        }
        if(root.left!=null){
            deep++;
            traversal(root.left,deep);
            deep--;
        }
        if(root.right!=null){
            deep++;
            traversal(root.right,deep);
            deep--;
        }
    }
 public int findBottomLeftValue(TreeNode root) {
        //层序遍历
        int res=0;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode pop=queue.poll();
                if(i==0){
                    res=pop.val;
                }
                if(pop.left!=null){
                    queue.offer(pop.left);
                }
                if(pop.right!=null){
                    queue.offer(pop.right);
                }
            }
        }
        return res;
    }

4.总结:

112. 路径总和  

1.题目:

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:


输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

2.思想:

3.代码:

public boolean hasPathSum(TreeNode root, int targetSum) {
        //递归
        if(root==null){
            return false;
        }
        return traversal(root,targetSum-root.val);
    }
    public boolean traversal(TreeNode root, int sum){
        if(root.left==null && root.right ==null && sum==0){
            return true;
        }
        if(root.left==null &&root.right==null){
            return false;
        }
        if(root.left!=null){
            sum-=root.left.val;
            if(traversal(root.left,sum)){
                return true;
            }
            sum+=root.left.val;
        }
        if(root.right!=null){
            sum-=root.right.val;
            if(traversal(root.right,sum)){
                return true;
            }
            sum+=root.right.val;
        }
        return false;
    }

4.总结:

113.路径总和ii

1.题目:

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:


输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

2.思想:

3.代码:

 public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        //递归
        List<List<Integer>> res=new ArrayList<>();
        List<Integer> path=new LinkedList<>();
        if(root==null){
            return res;
        }
        traversal(root,res,path,targetSum);
        return res;
    }
    public void traversal(TreeNode root,List<List<Integer>> res,List<Integer> path,int sum){
        path.add(root.val);
        if(root.left==null &&root.right==null){
            if(sum-root.val==0){
                res.add(new ArrayList<>(path));
            }
            return;
        }
        if(root.left!=null){
            traversal(root.left,res,path,sum-root.val);
            path.remove(path.size()-1);
        }
        if(root.right!=null){
            traversal(root.right,res,path,sum-root.val);
            path.remove(path.size()-1);
        }
    }

4.总结:

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

1.题目:

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

2.思想:

3.代码:

public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder.length==0){
            return null;
        }
        TreeNode root=new TreeNode(postorder[postorder.length-1]);
        for(int i=0;i<inorder.length;i++){
            if(root.val==inorder[i]){
                int[] inorderleft=Arrays.copyOfRange(inorder,0,i);
                int[] inorderright=Arrays.copyOfRange(inorder,i+1,inorder.length);
                int[] postorderleft=Arrays.copyOfRange(postorder,0,i);
                int[] postorderright=Arrays.copyOfRange(postorder,i,postorder.length-1);
                root.left=buildTree(inorderleft,postorderleft);
                root.right=buildTree(inorderright,postorderright);
            }
        }
        return root;
    }

4.总结:

105.从前序与中序遍历序列构造二叉

1.题目:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

2.思想:

3.代码:

public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0){
            return null;
        }
        //创建根节点
        int rootvalue=preorder[0];
        TreeNode root=new TreeNode(rootvalue);
        //根据根节点找到左右子树
        for(int i=0;i<inorder.length;i++){
            if(inorder[i]==rootvalue){
                int[] inleft=Arrays.copyOfRange(inorder,0,i);
                int[] inright=Arrays.copyOfRange(inorder,i+1,inorder.length);
                int[] preleft=Arrays.copyOfRange(preorder,1,i+1);
                int[] preright=Arrays.copyOfRange(preorder,i+1,preorder.length);
                root.left=buildTree(preleft,inleft);
                root.right=buildTree(preright,inright);
            }
        }
        return root;
    }

4.总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值