LeetCode- 108/109. Convert Sorted Array/List to Binary Search Tree (JAVA)

来源:互联网 发布:天津中年同志软件 编辑:程序博客网 时间:2024/05/23 18:31

108. Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

每次找到排序数组的中点,中点左边的子排序数组构成左子树,中点右边的子排序数组构成右子树。就这样递归进行.(注意边界)

public TreeNode sortedArrayToBST(int[] nums) {return builder(nums, 0, nums.length - 1);}private TreeNode builder(int[] nums, int left, int right) {if (left > right)return null;// 上层跟结点连接下层根节点int mid = left + (right - left) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = builder(nums, left, mid - 1);root.right = builder(nums, mid + 1, right);return root;}

109. Convert Sorted List to Binary Search Tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

上体类似,但要求链表的中点,用快慢指针求链表的中点。注意一下求中点即可。空间和时间都为O(n):

public TreeNode sortedListToBST(ListNode head) {if (head == null)return null;// 传入前闭后开区间return builder(head, null);}// start和end是前闭后开private TreeNode builder(ListNode start, ListNode end) {if (start == end)return null;ListNode mid = getMid(start, end);TreeNode root = new TreeNode(mid.val);root.left = builder(start, mid);root.right = builder(mid.next, end);return root;}// 获取中间结点private ListNode getMid(ListNode start, ListNode end) {ListNode slow = start;ListNode fast = start;// 注意这个不等于end用法,while (fast != end && fast.next != end) {slow = slow.next;fast = fast.next.next;}return slow;}

discuss的o(n)解法,采用 中序遍历,递归结点

一种自底向上的方法,算法复杂度为O(N)。先递归构建左子树,在构建左子树的同时不断移动链表的头指针,链表的头指针永远是对应当前子树位置的。一直到左叶子节点,左叶子节点对应的就是链表的第一个元素,生成左叶子节点之后移动链表当前指针。

ListNode currentHead = null;TreeNode buildTree(int start, int end) {if (start > end) {return null;}int mid = start + (end - start) / 2;TreeNode left = buildTree(start, mid - 1);TreeNode root = new TreeNode(currentHead.val);root.left = left;currentHead = currentHead.next;root.right = buildTree(mid + 1, end);return root;}public TreeNode sortedListToBST(ListNode head) {if (head == null) {return null;}currentHead = head;int len = 0;while (head != null) {len++;head = head.next;}return buildTree(0, len - 1);}


0 0
原创粉丝点击