首页 > 编程语言 >【算法】Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树

【算法】Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树

时间:2022-11-21 21:00:14浏览次数:33  
标签:TreeNode val nums int next 链表 二叉树 Java ListNode

有序链表转换二叉搜索树

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0/
-3 9 / / -10 5

Java代码参考

public class ListNode {
    int val;
    ListNode next;
    ListNode() {
    }
    ListNode(int val) {
        this.val = val;
    }
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
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 sortedListToBST(ListNode head) {
        if (head == null)
            return null;
        return helper(head, null);
    }
    private TreeNode helper(ListNode start, ListNode end) {
        if (start == end)
            return null;
        ListNode slow = start;
        ListNode fast = start;
        while (fast != end && fast.next != end) {
            slow = slow.next;
            fast = fast.next.next;
        }
        TreeNode root = new TreeNode(slow.val);
        root.left = helper(start, slow);
        root.right = helper(slow.next, end);
        return root;
    }
}

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

根据一棵树的中序遍历与后序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 /
9 20 /
15 7

Java代码参考

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }
}
class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return helper(inorder, postorder, postorder.length - 1, 0, inorder.length - 1);
    }
    public TreeNode helper(int[] inorder, int[] postorder, int postEnd, int inStart, int inEnd) {
        if (inStart > inEnd) {
            return null;
        }
        int currentVal = postorder[postEnd];
        TreeNode current = new TreeNode(currentVal);
        int inIndex = 0;
        for (int i = inStart; i <= inEnd; i++) {
            if (inorder[i] == currentVal) {
                inIndex = i;
            }
        }
        TreeNode left = helper(inorder, postorder, postEnd - (inEnd - inIndex) - 1, inStart, inIndex - 1);
        TreeNode right = helper(inorder, postorder, postEnd - 1, inIndex + 1, inEnd);
        current.left = left;
        current.right = right;
        return current;
    }
}

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) {     print(nums[i]); }

示例 1:

输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2]

解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3]

解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

0 <= nums.length <= 100 0 <= nums[i] <= 50 0 <= val <= 100

Java代码参考

class Solution {
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        for (int i = 0; i < len;) {
            if (nums[i] == val) {
                nums[i] = nums[len - 1];
                len--;
            } else {
                i++;
            }
        }
        return len;
    }
}

标签:TreeNode,val,nums,int,next,链表,二叉树,Java,ListNode
From: https://blog.51cto.com/u_15312559/5875305

相关文章

  • java lambda 表达式 加不加大括号的问题
     1.如果方法体为表达式,算式,可以不加大括号Arrays.sort(startEnd, (o1,o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);2.如果要加大括号,则......
  • 温故而知新——java知识,主要是io流体系
    多态多态的使用:总结:方法的重载static修饰变量和方法工具类重新认识main方法在‘EditConfiguration’中配置args(了解即可)代码块抽象类接口、父类、多......
  • Java设计模式--单例模式
    单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其......
  • Java 反射测试
    importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;/***Java反射测试**@authorAdministrator**/publicclassR......
  • java学习二
    一.小结1.标识符是程序中事务的名称2.标志符是由字母 数字 下划线 和美元符号$构成的字符序列3.标识符必须以字母或下划线开头,不能以数字开头4.标识符不能是保留......
  • Java 比较两个对象的不同之处(old, new) 包含 bean 对象下的 list, Map , bean 的细节
    Java 比较两个对象的不同之处(old,new)  包含bean对象下的list,Map,bean的细节 packagecom.icil.pinpal.test1;importcom.alibaba.fastjson.JSONObject;......
  • JavaScript基础(二)
    JavaScript基础第04天笔记1-数组1.1数组的概念数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。数组是指一组数据的集合,其中的每个数据被称作元素,在......
  • java桌面端开发为什么没就行起来,大部分人选qt,winform,electron?
    java桌面端开发为什么没就行起来的主要原因是基于Java开发的windows桌面端软件的安装部署运行的不便,绝大多数的windows电脑没有安装Java运行环境,并且基于不同版本Java开......
  • javascript - 练习题:事件练习 - 扫雷
    HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="w......
  • java中给手机号、身份证号等敏感信息脱敏
    sql方式:以手机号示例:ub:表别名 前三后四格式REPLACE(ub.phone,SUBSTR(ub.phone,4,4),'****')ASphone, mybatispils方式:先试用分页构造器查询出数......