zoukankan      html  css  js  c++  java
  • [Swift]LeetCode109. 有序链表转换二叉搜索树 | Convert Sorted List to Binary Search Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9951174.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

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

    For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

    Example:

    Given the sorted linked list: [-10,-3,0,5,9],
    
    One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:
    
          0
         / 
       -3   9
       /   /
     -10  5

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

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

    示例:

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

    60ms
     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 /**
    13  * Definition for a binary tree node.
    14  * public class TreeNode {
    15  *     public var val: Int
    16  *     public var left: TreeNode?
    17  *     public var right: TreeNode?
    18  *     public init(_ val: Int) {
    19  *         self.val = val
    20  *         self.left = nil
    21  *         self.right = nil
    22  *     }
    23  * }
    24  */
    25 class Solution {
    26     func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    27         // Count the length
    28         var l = 0
    29         var p = head
    30         while p != nil {
    31             l += 1
    32             p = p?.next
    33         }
    34         
    35         // Build an empty height balanced binary tree
    36         func buildTree(_ numNodes: Int) -> TreeNode? {
    37             if numNodes == 0 {
    38                 return nil
    39             }
    40             let ret = TreeNode(0)
    41             let numLeft = (numNodes - 1) / 2
    42             let numRight = numNodes - 1 - numLeft
    43             ret.left = buildTree(numLeft)
    44             ret.right = buildTree(numRight)
    45             return ret
    46         }
    47         let root = buildTree(l)
    48         
    49         // Fill the tree
    50         p = head
    51         func dfs(_ n: TreeNode?) {
    52             guard let node = n else { return }
    53             dfs(node.left)
    54             node.val = p!.val
    55             p = p?.next
    56             dfs(node.right)
    57         }
    58         
    59         dfs(root)
    60         return root
    61     }
    62 }

    64ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 /**
    13  * Definition for a binary tree node.
    14  * public class TreeNode {
    15  *     public var val: Int
    16  *     public var left: TreeNode?
    17  *     public var right: TreeNode?
    18  *     public init(_ val: Int) {
    19  *         self.val = val
    20  *         self.left = nil
    21  *         self.right = nil
    22  *     }
    23  * }
    24  */
    25 class Solution {
    26     func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    27         guard head != nil else { return nil }
    28         var arr: [Int] = []
    29         var node = head
    30         while node != nil {
    31             arr.append(node!.val)
    32             node = node?.next
    33         }
    34         let mid = arr.count/2
    35         let root = TreeNode(arr[mid])
    36         appendBST(root, arr)
    37         return root
    38     }
    39     
    40     private func appendBST(_ root: TreeNode?, _ arr: [Int]) {
    41         guard arr.count > 1, let root = root else { return }
    42         let mid = arr.count/2
    43         let leftArr = Array(arr[0..<mid])
    44         let rightArr = Array(arr[mid+1..<arr.count])
    45         if leftArr.count > 1 {
    46             root.left = TreeNode(leftArr[leftArr.count/2])
    47             appendBST(root.left, leftArr)
    48         } else if leftArr.count == 1 {
    49             root.left = TreeNode(leftArr[0])
    50         }
    51         if rightArr.count > 1 {
    52             root.right = TreeNode(rightArr[rightArr.count/2])
    53             appendBST(root.right, rightArr)
    54         } else if rightArr.count == 1 {
    55             root.right = TreeNode(rightArr[0])
    56         }
    57     }
    58 }

    76ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 /**
    13  * Definition for a binary tree node.
    14  * public class TreeNode {
    15  *     public var val: Int
    16  *     public var left: TreeNode?
    17  *     public var right: TreeNode?
    18  *     public init(_ val: Int) {
    19  *         self.val = val
    20  *         self.left = nil
    21  *         self.right = nil
    22  *     }
    23  * }
    24  */
    25 class Solution {
    26     func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    27         var head = head
    28         if head == nil {
    29             return nil
    30         }
    31         let len = getLength(head)
    32         var h = head
    33         return sortedListToBST(0, len - 1, &head)
    34     }
    35     private func getLength(_ head: ListNode?) -> Int {
    36         var head = head
    37         var len = 0
    38         while head != nil {
    39             len += 1
    40             head = head!.next
    41         }
    42         return len
    43     }
    44     private func sortedListToBST(_ start: Int, _ end: Int, _ currNode: inout ListNode?) -> TreeNode? {
    45         if start > end {
    46             return nil
    47         }
    48         let mid = (start + end) / 2
    49         let left = sortedListToBST(start, mid - 1, &currNode)
    50         var root = TreeNode(currNode!.val)
    51         currNode = currNode!.next
    52         let right = sortedListToBST(mid + 1, end, &currNode)
    53         root.left = left
    54         root.right = right
    55         return root
    56     }
    57 }

    88ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 /**
    13  * Definition for a binary tree node.
    14  * public class TreeNode {
    15  *     public var val: Int
    16  *     public var left: TreeNode?
    17  *     public var right: TreeNode?
    18  *     public init(_ val: Int) {
    19  *         self.val = val
    20  *         self.left = nil
    21  *         self.right = nil
    22  *     }
    23  * }
    24  */
    25 class Solution {
    26     func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    27         if head == nil {
    28             return nil
    29         }
    30         if head?.next == nil{
    31             return TreeNode(head!.val)
    32         }
    33         var fast = head
    34         var slow = head
    35         var middle = head
    36         while fast?.next != nil && fast?.next?.next != nil {
    37             middle = slow
    38             slow = slow?.next
    39             fast = fast?.next?.next
    40         }
    41         fast = slow?.next
    42         let root = TreeNode(slow!.val)
    43         if head!.val != slow!.val {
    44             middle?.next = nil
    45             root.left = sortedListToBST(head)
    46         }
    47         root.right = sortedListToBST(fast)
    48         return root
    49     }
    50 }

    148ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 /**
    13  * Definition for a binary tree node.
    14  * public class TreeNode {
    15  *     public var val: Int
    16  *     public var left: TreeNode?
    17  *     public var right: TreeNode?
    18  *     public init(_ val: Int) {
    19  *         self.val = val
    20  *         self.left = nil
    21  *         self.right = nil
    22  *     }
    23  * }
    24  */
    25 class Solution {
    26     func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    27         var head = head
    28         var array: [Int] = []
    29         while head != nil {
    30             array.append(head!.val)
    31             head = head?.next
    32         }
    33         
    34         return sortedArrayToBST(array)
    35     }
    36     
    37     func sortedArrayToBST(_ nums: [Int]) -> TreeNode? {
    38         guard !nums.isEmpty else {
    39             return nil
    40         }
    41         
    42         let rootIndex = nums.count/2
    43         let root = TreeNode(nums[rootIndex])
    44         root.left = sortedArrayToBST([Int](nums[..<rootIndex]))
    45         root.right = sortedArrayToBST([Int](nums[(rootIndex+1)...]))
    46         
    47         return root
    48     }
    49 }
  • 相关阅读:
    HttpRunner接口自动化测试框架
    使用Appium 测试微信小程序和微信公众号方法
    WiFi无线连接真机进行Appium自动化测试方法
    idea tomcat 乱码问题的解决及相关设置
    解决idea导入maven项目缺少jar包的问题
    Docker php安装扩展步骤详解
    Python之No module named setuptools 安装pip
    MySQL中group_concat函数 --- 很有用的一个用来查询出所有group by 分组后所有 同组内的 内容
    Nginx如何来配置隐藏入口文件index.php(代码)
    vueThink框架搭建与填坑(new)
  • 原文地址:https://www.cnblogs.com/strengthen/p/9951174.html
Copyright © 2011-2022 走看看