【JAVA刷题初阶】刷爆力扣第十一弹——二叉树


🎪 前言:关于JAVA刷题

🤙关于JAVA的学习出了看视频以外,那就是刷题了,朋友们,你们有没有过这样的感觉,在网上看了视频过后感觉自己什么都听懂了,但就是写题和做项目时无从下手,或者就是因为某个细节一直错一直改,那背后的原因是什么呢?四个字——题刷少了,这里新一建议去Leetcode看看,那里的题库资源很丰富,并且在全球都有广泛涉猎。不仅如此,这里还有 课程 + 刷题 + 面经 + 求职 + 讨论区分享解题思路,用过的人都说好😜
在这里插入图片描述
👉除此之外,我的建议是初学者从简单题开始练习,因为简单题是一切题的基础,一切的困难题都是从简单题衍生而来的,每天刷那么2~3题,后期再慢慢刷中等题,困难题,经过一段时间后会有很不错的提升
在这里插入图片描述
此外,在我们有一定的提升之后,我们便可以去刷剑指offer了,在这里预祝各位大学生以及初学者都拿到自己满意的offer!💖


第一题:根据二叉树创建字符串

👇👇👇
做题链接戳这里:606.根据二叉树创建字符串

🚀 题目描述

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

🚀示例

在这里插入图片描述

🚀提示

● 树中节点的数目范围是 [1, 104]
● -1000 <= Node.val <= 1000

🧰题解

首先我们要进行频繁的字符串拼接,那么最省空间的就是我们的StringBuilder类型了,我们再看看它的用例,根据它对应的两个用例,我们分别在左树空和左树不空以及右树空,右树不空的情况append括号即可。

public void treeToString(TreeNode root, StringBuilder sb){
        if (root == null) return;
        sb.append(root.val);

        if (root.left != null){
            sb.append("(");
            treeToString(root.left, sb);
            sb.append(")");
        }else{
            if (root.right == null){
                return;
            }else{
                sb.append("()");
            }
        }

        if (root.right != null){
            sb.append("(");
            treeToString(root.right,sb);
            sb.append(")");
        }else{
            return;
        }
    }
    public String tree2str(TreeNode root) {
        if (root == null){
            return null;
        }
        StringBuilder sb = new StringBuilder();
        treeToString(root, sb);
        return sb.toString();
    }

在这里插入图片描述

第二题:二叉树的层序遍历II

👇👇👇
做题链接戳这里,107.二叉树的层序遍历II

🚀 题目描述

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

🚀示例

在这里插入图片描述

🚀提示

● 树中节点数目在范围 [0, 2000] 内
● -1000 <= Node.val <= 1000

🧰题解

我们上一篇博客讲了层序遍历,那么现在它的plus版本来了,它这一波是反向输出,我们想到既然是倒转了一下,用什么方法最简单呢,有什么方法可以把元素一直放到最前面呢——相信大家已经想到了,头插法,但是我们的ArrayLis没有头插哎,那就用LinkedList呗,完美KO一道题。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        LinkedList<List<Integer>> lists = new LinkedList<>();
        if (root == null) return lists;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<>();
            while(size != 0) {
                TreeNode node = queue.poll();
                list.add(node.val);
                //System.out.println(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
                size--;
            }
            lists.addFirst(list);
        }
        return lists;
    }
}

在这里插入图片描述

第三题:将有序数组转换为二叉搜索树

👇👇👇
做题链接戳这里:108.将有序数组转换为二叉搜索树

🚀 题目描述

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

🚀示例

在这里插入图片描述

🚀提示

● 1 <= nums.length <= 104
● -104 <= nums[i] <= 104
● nums 按 严格递增 顺序排列

🧰题解

我们从题中提取几个要素,有序数组,二叉搜索树,高度平衡,我去,这要素挺多啊,我们前一篇博客给大家提了一下二叉搜索树,它的中序遍历是有序的,也就是说,给我们的数组即为二叉搜索树的中序遍历,我们按照这个思路继续下去,要使得其高度平衡,最简单的方法是找中点,找中点的时候可不能直接路径 / 2,那样可能会造成数据溢出,用题解中方法即可。

class Solution {
    public TreeNode getBST(int[] nums, int inbegin, int inend){
        if (inbegin > inend){
            return null;
        }
        int rootIndex = (inend - inbegin) / 2 + inbegin;//用此方法即可
        
        TreeNode root = new TreeNode(nums[rootIndex]);
        root.left = getBST(nums, inbegin, rootIndex - 1);
        root.right = getBST(nums,rootIndex + 1, inend);
        return root;
    }

    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums.length == 0){
            return null;
        }
        return getBST(nums,0,nums.length - 1);
    }
}

在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Corwttaml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值