Welcome to Subscribe On Youtube
Question
Formatted question description: https://leetcode.ca/all/109.html
Given the head
of a singly linked list where elements are sorted in ascending order, convert it to a height-balanced binary search tree.
Example 1:
Input: head = [-10,-3,0,5,9] Output: [0,-3,9,-10,null,5] Explanation: One possible answer is [0,-3,9,-10,null,5], which represents the shown height balanced BST.
Example 2:
Input: head = [] Output: []
Constraints:
- The number of nodes in
head
is in the range[0, 2 * 104]
. -105 <= Node.val <= 105
Algorithm
The idea is exactly the same as the previous 108. Convert Sorted Array to Binary Search Tree
, except that the data types of operations are different, one is an array and the other is a linked list.
Arrays are convenient because you can directly access any element through index, but linked lists cannot. Because the binary search method needs to find the midpoint every time
.
After finding the midpoint, we need to establish a root node of the number based on the midpoint value, and then we need to disconnect the original linked list and divide it into two linked lists, neither of which can contain the original midpoint, and then recursively call the two linked lists separately dfs function, connected to the left and right child nodes respectively.
Code
-
public class Convert_Sorted_List_to_Binary_Search_Tree { /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; next = null; } * } */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedListToBST(ListNode head) { if (head == null) { return null; } if (head.next == null) { return new TreeNode(head.val); } // find mid ListNode dummy = new ListNode(0); dummy.next = head; ListNode slow = head, fast = head, prev = dummy; while (fast != null && fast.next != null) { prev = slow; slow = slow.next; fast = fast.next.next; } // prev is one before mid // ListNode 2ndPartHead = slow.next; // @note@note: illegal, cannot start with number ListNode newHead = slow.next; prev.next = null; // @note: cut TreeNode root = new TreeNode(slow.val); root.left = sortedListToBST(head); root.right = sortedListToBST(newHead); return root; } } } ############ /** * Definition for singly-linked list. * 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; } * } */ /** * 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 sortedListToBST(ListNode head) { List<Integer> nums = new ArrayList<>(); for (; head != null; head = head.next) { nums.add(head.val); } return buildBST(nums, 0, nums.size() - 1); } private TreeNode buildBST(List<Integer> nums, int start, int end) { if (start > end) { return null; } int mid = (start + end) >> 1; TreeNode root = new TreeNode(nums.get(mid)); root.left = buildBST(nums, start, mid - 1); root.right = buildBST(nums, mid + 1, end); return root; } }
-
// OJ: https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ // Time: O(NlogN) // Space: O(logN) class Solution { int getLength(ListNode *head) { int ans = 0; for (; head; head = head->next, ++ans); return ans; } TreeNode *dfs(ListNode *head, int len) { if (len == 0) return NULL; if (len == 1) return new TreeNode(head->val); auto p = head; for (int i = 0; i < len / 2; ++i) p = p->next; auto root = new TreeNode(p->val); root->left = dfs(head, len / 2); root->right = dfs(p->next, (len - 1) / 2); return root; } public: TreeNode* sortedListToBST(ListNode* head) { int len = getLength(head); return dfs(head, len); } };
-
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]: if not head: return None if not head.next: return TreeNode(head.val) # find mid dummy = ListNode(0) dummy.next = head slow, fast, prev = head, head, dummy while fast and fast.next: prev = slow slow = slow.next fast = fast.next.next # prev is one before mid new_head = slow.next prev.next = None # cut root = TreeNode(slow.val) root.left = self.sortedListToBST(head) root.right = self.sortedListToBST(new_head) return root ################# class Solution: # convert to array[], extra space def sortedListToBST(self, head: ListNode) -> TreeNode: def buildBST(nums, start, end): if start > end: return None mid = (start + end) >> 1 return TreeNode( nums[mid], buildBST(nums, start, mid - 1), buildBST(nums, mid + 1, end) ) nums = [] while head: nums.append(head.val) head = head.next return buildBST(nums, 0, len(nums) - 1)
-
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func sortedListToBST(head *ListNode) *TreeNode { nums := []int{} for head != nil { nums = append(nums, head.Val) head = head.Next } return buildBST(nums, 0, len(nums)-1) } func buildBST(nums []int, start, end int) *TreeNode { if start > end { return nil } mid := (start + end) >> 1 return &TreeNode{ Val: nums[mid], Left: buildBST(nums, start, mid-1), Right: buildBST(nums, mid+1, end), } }
-
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ /** * Definition for a binary tree node. * class TreeNode { * val: number * left: TreeNode | null * right: TreeNode | null * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } * } */ const find = (start: ListNode | null, end: ListNode | null) => { let fast = start; let slow = start; while (fast !== end && fast.next !== end) { fast = fast.next.next; slow = slow.next; } return slow; }; const build = (start: ListNode | null, end: ListNode | null) => { if (start == end) { return null; } const node = find(start, end); return new TreeNode(node.val, build(start, node), build(node.next, end)); }; function sortedListToBST(head: ListNode | null): TreeNode | null { return build(head, null); }
-
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {ListNode} head * @return {TreeNode} */ var sortedListToBST = function (head) { const buildBST = (nums, start, end) => { if (start > end) { return null; } const mid = (start + end) >> 1; const root = new TreeNode(nums[mid]); root.left = buildBST(nums, start, mid - 1); root.right = buildBST(nums, mid + 1, end); return root; }; const nums = new Array(); for (; head != null; head = head.next) { nums.push(head.val); } return buildBST(nums, 0, nums.length - 1); };
-
// Definition for singly-linked list. // #[derive(PartialEq, Eq, Clone, Debug)] // pub struct ListNode { // pub val: i32, // pub next: Option<Box<ListNode>> // } // // impl ListNode { // #[inline] // fn new(val: i32) -> Self { // ListNode { // next: None, // val // } // } // } // Definition for a binary tree node. // #[derive(Debug, PartialEq, Eq)] // pub struct TreeNode { // pub val: i32, // pub left: Option<Rc<RefCell<TreeNode>>>, // pub right: Option<Rc<RefCell<TreeNode>>>, // } // // impl TreeNode { // #[inline] // pub fn new(val: i32) -> Self { // TreeNode { // val, // left: None, // right: None // } // } // } use std::rc::Rc; use std::cell::RefCell; impl Solution { fn build(vals: &Vec<i32>, start: usize, end: usize) -> Option<Rc<RefCell<TreeNode>>> { if (start == end) { return None; } let mid = (start + end) >> 1; Some(Rc::new(RefCell::new(TreeNode { val: vals[mid], left: Self::build(vals, start, mid), right: Self::build(vals, mid + 1, end), }))) } pub fn sorted_list_to_bst(head: Option<Box<ListNode>>) -> Option<Rc<RefCell<TreeNode>>> { let mut vals = Vec::new(); let mut cur = &head; while let Some(node) = cur { vals.push(node.val); cur = &node.next; } Self::build(&vals, 0, vals.len()) } }