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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树相关的知识,希望对你有一定的参考价值。

有序链表转换二叉搜索树

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

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

示例:

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;
    


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

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

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

例如,给出

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:

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

示例 2:

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

提示:

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;
    

以上是关于算法Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题模版:101 - 110

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

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

LeetCode Java刷题笔记—106. 从中序与后序遍历序列构造二叉树

LeetCode Java刷题笔记—106. 从中序与后序遍历序列构造二叉树

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