算法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 Java刷题笔记—106. 从中序与后序遍历序列构造二叉树