代码练习第十八天|113. 路径总和 II、112. 路径总和、513. 找树左下角的值、105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树

文章介绍了如何在给定的二叉树结构中,通过递归方法寻找满足特定条件的路径和、判断是否存在目标和路径以及利用前序和中/后序遍历序列构建二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 路径总和 II
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        List<Integer> element = new ArrayList<>();
        pathSum(root,targetSum,res,element);
        return res;
    }
    public void pathSum(TreeNode root, int targetSum,
        List<List<Integer>> res,List<Integer> element){
        
        element.add(root.val);
        if(root.left == null && root.right==null){
            if(targetSum - root.val == 0) res.add(new ArrayList(element));
            return;
        }

        if(root.left != null) {
            pathSum(root.left,targetSum - root.val,res,element);
            element.remove(element.size()-1);
        }

        if(root.right != null) {
            pathSum(root.right,targetSum - root.val,res,element);
            element.remove(element.size()-1);
        }

    }
}
  1. 路径总和
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null) return false;
        targetSum -= root.val;
        if(root.left == null && root.right==null ) return targetSum ==0;
        if(root.left == null && root.right==null && targetSum !=0) return false;

        if(root.left != null ) {
            if( hasPathSum(root.left,targetSum)) return true;

        }
        if(root.right != null ) {
            if( hasPathSum(root.right,targetSum)) return true;

        }
        return false;
    }


}
  1. 找树左下角的值
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int tmpDeep = 0;
    int value = 0;
    public int findBottomLeftValue(TreeNode root) {
        value = root.val;
        findLeftValue(root,0);
        return value;
    }
    public void findLeftValue(TreeNode root,int deep){
        if(root.left == null && root.right == null && deep > tmpDeep){
            value = root.val;
            tmpDeep = deep;
        }
        if(root.left != null) findLeftValue(root.left,deep + 1);
        if(root.right != null) findLeftValue(root.right,deep + 1);
    }
}
  1. 从前序与中序遍历序列构造二叉树
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0;i<inorder.length;i++){
            map.put(inorder[i],i);  
        }

        return findNode(preorder,0,preorder.length,inorder,0,inorder.length);
    }

    public TreeNode findNode(int[] preorder, int preBegin, int preEnd, int[] inorder, int inBegin, int inEnd) {
        if(preBegin >= preEnd || inBegin >= inEnd){
            return null;
        }

        int rootIndex = map.get(preorder[preBegin]);
        TreeNode root = new TreeNode(inorder[rootIndex]);
        int lenOfLeft = rootIndex-inBegin;
        root.left = findNode(preorder,preBegin+1,preBegin+lenOfLeft+1,inorder,inBegin,rootIndex);
        root.right = findNode(preorder,preBegin+lenOfLeft+1,preEnd,inorder, rootIndex + 1, inEnd);
        return root;

    }

}
  1. 从中序与后序遍历序列构造二叉树
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        for(int i = 0;i<inorder.length;i++){
            map.put(inorder[i],i);  
        }

        return createNode(inorder,0,inorder.length,postorder,0,postorder.length);
    }

    public TreeNode createNode(int[] inorder,int inbegain,int inEnd,
                                int[] postorder,int postBegain,int postEnd){
        if(inbegain >= inEnd || postBegain >= postEnd){
            return null;
        }

        int rootIndex = map.get(postorder[postEnd -1]);
        TreeNode root = new TreeNode(inorder[rootIndex]);
        int length = rootIndex - inbegain;
        root.left = createNode(inorder,inbegain,rootIndex,postorder,postBegain,postBegain+length);
        root.right = createNode(inorder,rootIndex + 1,inEnd,postorder,postBegain+length,postEnd-1);
        return root;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值