首页 > 编程语言 >二叉树习题其三-Java【力扣】【算法学习day.10】

二叉树习题其三-Java【力扣】【算法学习day.10】

时间:2024-10-22 15:20:19浏览次数:3  
标签:node right TreeNode val int 二叉树 Java 习题 left

前言

书接上篇文章二叉树习题其二,这篇文章我们将基础拓展

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

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

题目链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题面:

基本分析:后序遍历数组的最后一个值其实就是根节点,由于中序遍历的顺序是前中后,那么我们在中序数组中定位到根节点的位置,例如上图样例是3,那么在 3左边的就是左子树,右边的就是右子树,这就是递归的一个过程,然后使用递归

/**
 * 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<>();
    int[] postorderflag;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = inorder.length-1;
        for(int i = 0;i<=n;i++)map.put(inorder[i],i);
        postorderflag = postorder;
        return recursion(0,n,0,n);
        }
        public TreeNode recursion(int is,int ie,int ps,int pe){
            if(is>ie||ps>pe)return null;
            int root = postorderflag[pe];
            TreeNode node = new TreeNode(root);
            int ri = map.get(root);
            node.left = recursion(is,ri-1,ps,ps+ri-is-1);
            node.right = recursion(ri+1,ie,ps+ri-is,pe-1);
            return node;
        }    
    }

2.最大二叉树

题目链接:654. 最大二叉树 - 力扣(LeetCode)

题面:

基本分析:就是区间找最值然后构造树

代码:

/**
 * 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 numsflag[];
     Map<Integer,Integer> map = new HashMap<>();
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        numsflag = nums;
        int n = nums.length-1;
        for(int i = 0;i<=n;i++)map.put(nums[i],i);
        return recursion(0,n);
    }
    public TreeNode recursion(int l,int r){
        if(l>r)return null;
        int max = Integer.MIN_VALUE;
        for(int i = l;i<=r;i++){
            if(numsflag[i]>max)max = numsflag[i];
        } 
        int index = map.get(max);
        TreeNode node = new TreeNode(max);
        node.left = recursion(l,index -1);
        node.right = recursion(index+1,r);
        return node;
    }
    
}

3.合并二叉树

题目链接:617. 合并二叉树 - 力扣(LeetCode)

题面:

基本分析:两者同时遍历

/**
 * 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 TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        return recursion(root1,root2);
    }
    public TreeNode recursion(TreeNode root1, TreeNode root2){
        TreeNode node = new TreeNode(Integer.MAX_VALUE);
        if(root1==null&&root2==null)return null;
        if(root1==null||root2==null){
            return root1==null?root2:root1;
        }
        node.val=(root2.val+root1.val);
        node.left = recursion(root1.left,root2.left);
        node.right = recursion(root1.right,root2.right);
        return node;
    }

}

4.二叉搜索树中的搜索

题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)

题面:

基本分析:就是遍历

代码: 

/**
 * 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 {
    TreeNode ans = new TreeNode(Integer.MAX_VALUE);
    int flag = 0;
    public TreeNode searchBST(TreeNode root, int val) {
        flag = val;
        recursion(root);
        return ans.val==Integer.MAX_VALUE?null:ans;
    }
    public void recursion(TreeNode node){
        if(node==null)return;
        if(node.val==flag)ans = node;
        recursion(node.left);
        recursion(node.right);
    }
}

 5.验证二叉搜索树

题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)

题面:

基本分析:采用限定范围的思想可以规避很多变量的维护

代码:

/**
 * 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 {
    ArrayList<Integer> listleft = new ArrayList<>();
    ArrayList<Integer> listright = new ArrayList<>();
    public boolean isValidBST(TreeNode root) {
       return recursion(root,Long.MIN_VALUE,Long.MAX_VALUE);
    }
    public boolean recursion(TreeNode node,long left,long right){
        if(node==null)return true;
        long flag = node.val;
        return flag>left&&flag<right&&recursion(node.left,left,flag)&&recursion(node.right,flag,right);
    }
}

后言

上面是二叉树的部分习题,下一篇会讲解二叉树的其他相关力扣习题,希望有所帮助,一同进步,共勉! 

标签:node,right,TreeNode,val,int,二叉树,Java,习题,left
From: https://blog.csdn.net/2301_79232523/article/details/143139929

相关文章

  • 备战蓝桥杯JAVA B组Day7
    备战蓝桥杯JAVAB组Day7前言零基础小白备战蓝桥杯第七天,刷题内容为:洛谷题单【入门3】循环结构。P5722【深基4.例11】数列求和AC代码:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(......
  • java程序设置开机自启
    Linux系统jar包开机自启第一步:创建service文件sudonanoetc/systemd/system/myapp.service第二步:将下面代码复制到刚才创建的文件里面,保存[Unit]Description=JavacameraserviceAfter=network.target[Service]WorkingDirectory=/home/app/javaEnvironment="LD_LIBR......
  • JavaScript 函数定义
    JavaScript使用关键字 function 定义函数。函数可以通过声明定义,也可以是一个表达式。functionfunctionName(parameters){执行的代码}functionmyFunction(a,b){ returna*b;}函数表达式JavaScript函数可以通过一个表达式定义。函数表达式可以存储在变......
  • java中的锁及实现原理
    重入锁ReentrantLock重人锁ReentrantLock,顾名思义,就是支持重进人的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进人,但是在调lock()方法时,已经获取到锁的线......
  • [Javascript] Covert for loop code to recursion code
    //loopfunctiondemo1(){//beforeloopbeforeLoopCode;for(initCode;conditionCode;stepChangeCode){loopCode}postCode}//recursivefunctiondemo2(){beforeLoopCode;initCodefunction_m(){if(!c......
  • [转]【Java】DelayQueue 的延时任务实现
    来源:Kimi.ai 在Java中,DelayQueue是一个非常有用的工具,用于实现延迟任务。以下是一个使用示例,它展示了如何使用DelayQueue:基本使用示例:首先,你需要创建一个实现了 Delayed 接口的类。这个类需要实现 getDelay 方法,该方法返回延迟时间,以及 compareTo 方法,用于确定元素在......
  • 面试常见Java八股文整理!!!
    1.Java线程start方法和run方法的区别start方法启动了一个新的线程,而run方法不能启动一个新线程,还是在main线程下运行,程序依然是主线程一个线程在运行。调用start方法可以启动线程,而run方法只是thread的一个普通方法还是在主线程中执行。通过start()方法来启动的新线程,处于就......
  • JavaScript 第25章:Vue 基础
    在学习JavaScript的第25章关于Vue的基础知识时,我们将从以下几个方面来了解Vue框架,并通过一个实战案例来巩固所学的知识。Vue概述Vue.js是一个用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,易于上手,同时......
  • 史上最强Java面试八股文合集,持续更新!
    线程池核心参数补充:还有一个参数 threadFactory(线程工厂):用于创建新线程的工厂,通常用于给线程设定名称、设置为守护线程等。默认的线程工厂会创建一个普通的、非守护线程。ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor( 3,......
  • Java相关面试题(2024大厂高频面试题系列)
    一、多线程基础基础知识1.并发编程1.1并发编程的优缺点优点:充分利用多核CPU的计算能力,通过并发编程的形式将多核CPU的计算能力发挥到极致,性能得到提升。方面进行业务的拆分。提高系统并发能力和性能:高并发系统的开发,并发编程会显得尤为重要,利用好多线程机制可以大大提高......