构造二叉树算法题总结(第二十八天)

文章介绍了与二叉树相关的几个编程问题,包括计算左叶子节点之和、查找最底层最左边节点的值、路径总和判断与求解、最大二叉树构建以及合并两个二叉树。这些问题涉及递归算法和二叉树结构的运用。
摘要由CSDN通过智能技术生成

404. 左叶子之和

题目

给定二叉树的根节点 root ,返回所有左叶子之和。

答案

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        int res = 0;
        if(root==null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode curr = queue.poll();
                if(curr.left!=null){
                    queue.offer(curr.left);
                    //加入左节点时,判断是否为左叶子
                    if(curr.left.left==null && curr.left.right==null){
                        res += curr.left.val;
                    }
                }
                if(curr.right!=null) queue.offer(curr.right);
            }
        }
        return res;
    }
}







513. 找树左下角的值

题目

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

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

答案

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        int res = 0;
        if(root==null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode curr = queue.poll();
                //每一层的第一个
                if(i==0) res = curr.val;
                if(curr.left!=null) queue.offer(curr.left);
                if(curr.right!=null) queue.offer(curr.right);
            }
        }
        return res;
    }
}







112. 路径总和

题目

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

答案

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null){
            return false;
        }
        //根 左 右
        if(root.left==null && root.right==null && targetSum==root.val){
            return true;
        }
        boolean left = hasPathSum(root.left,targetSum-root.val);
        boolean right = hasPathSum(root.right,targetSum-root.val);
        return left || right;
    }
}







113. 路径总和 II

题目

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

答案

class Solution {
    List<List<Integer>> res = new ArrayList();
    List<Integer> list = new LinkedList();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        deal(root,targetSum);
        return res;
    }
    void deal(TreeNode root,int targetSum){
        if(root==null){
            return;
        }
        //根 左 右
        list.add(root.val);

        if(root.left==null && root.right==null && root.val==targetSum){
            res.add(new ArrayList(list));
        }
        deal(root.left,targetSum-root.val);
        deal(root.right,targetSum-root.val);
        
        list.removeLast();
    }
}








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

题目

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

答案

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map = new HashMap();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return deal(inorder,0,inorder.length,preorder,0,preorder.length);
    }
    TreeNode deal(int[] inorder,int inBegin,int inEnd,int[] preorder,int preBegin,int preEnd){
        if(inBegin>=inEnd || preBegin>=preEnd){
            return null;
        }
        int rootVal = preorder[preBegin];
        int rootIndex = map.get(rootVal);
        int leftLen = rootIndex - inBegin;
        // 根 左 右
        TreeNode root = new TreeNode(rootVal);
        root.left = deal(inorder,inBegin,inBegin+leftLen,preorder,preBegin+1,preBegin+1+leftLen);
        root.right = deal(inorder,rootIndex+1,inEnd,preorder,preBegin+1+leftLen,preEnd);
        return root;
    }
}







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

题目

给定两个整数数组 inorderpostorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树

答案

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map = new HashMap();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return deal(inorder,0,inorder.length,postorder,0,postorder.length);
    }
    TreeNode deal(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
        if(inBegin>=inEnd || postBegin>=postEnd){
            return null;
        }
        int rootVal = postorder[postEnd-1];
        int rootIndex = map.get(rootVal);
        int leftLen = rootIndex - inBegin;
        //根 左 右
        TreeNode root = new TreeNode(rootVal);
        root.left = deal(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+leftLen);
        root.right = deal(inorder,rootIndex+1,inEnd,postorder,postBegin+leftLen,postEnd-1);
        return root;
    }
}







654. 最大二叉树

题目

给定一个不重复的整数数组 nums最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边子数组前缀上 构建左子树。
  3. 递归地在最大值 右边子数组后缀上 构建右子树。

返回 nums 构建的 *最大二叉树*

答案

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return deal(nums,0,nums.length);
    }
    TreeNode deal(int[] nums,int begin,int end){
        if(end-begin<1){
            return null;
        }
        if(end-begin==1){
            return new TreeNode(nums[begin]);
        }
        int maxVal = nums[begin];
        int maxIndex = begin;
        for(int i=begin+1;i<end;i++){
            if(nums[i]>maxVal){
                maxVal = nums[i];
                maxIndex = i;
            }
        }
        // 根 左 右
        TreeNode root = new TreeNode(maxVal);
        root.left = deal(nums,begin,maxIndex);
        root.right = deal(nums,maxIndex+1,end);
        return root;
    }
}







617. 合并二叉树

题目

给你两棵二叉树: root1root2

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。

答案

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1==null){
            return root2;
        }
        if(root2==null){
            return root1;
        }
        //根 左 右
        TreeNode root = new TreeNode(root1.val+root2.val);
        root.left = mergeTrees(root1.left,root2.left);
        root.right = mergeTrees(root1.right,root2.right);
        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值