109.Convert sorted list to BST

    /*
     * 109.Convert sorted list to BST
     * 2016.12.24 by Mingyang
     * 这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的。
     * 这时候就要利用到树的中序遍历了,按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。
     * 思路就是先对左子树进行递归
     * 然后将当前结点作为根,迭代到下一个链表结点,最后在递归求出右子树即可。整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)
     * 但是我没用上面的二分查找,用的是快慢节点recursive来做,所以这么做就有缺陷:
     */
     public TreeNode sortedListToBST(ListNode head) {
            if(head == null)
                return null;
            ListNode fast = head;
            ListNode slow = head;
            ListNode prev =null;
            while(fast != null && fast.next != null)
            {
                fast = fast.next.next;
                prev =slow;
                slow=slow.next;
            }
            TreeNode root = new TreeNode(slow.val);
            if(prev != null)
                prev.next = null;
            else
                head  = null;
            root.left = sortedListToBST(head);
            root.right = sortedListToBST(slow.next);
            return root;
        }
    /*
     * 上面做法的缺陷在哪呢,这个跟Convert Sorted Array to Binary Search Tree比较近似,
     * 区别是元素存储的数据结构换成了链表,不过引入了一个重要的问题,就是链表的访问不是随机存取的,
     * 也就是不是O(1)的,如果每次去获取中点,然后进行左右递归的话,我们知道得到中点是O(n/2)=O(n)的,
     * 如此递推式是T(n) = 2T(n/2)+n/2,复杂度是O(nlogn),并不是线性的,所以这里我们就得利用到树的中序遍历了,
     * 按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。
     * 如此就能按照链表的访问顺序来构造,不会因此而增加找中间结点的复杂度。
     * 记住每次都需要node往后移动一位
     */
     private ListNode node;
     public TreeNode sortedListToBST2(ListNode head) {
         if(head == null){
             return null;
         }
         int size = 0;
         ListNode runner = head;
         node = head;
         while(runner != null){
             runner = runner.next;
             size ++;
         }
         return inorderHelper(0, size - 1);
     }
     public TreeNode inorderHelper(int start, int end){
         if(start > end){
             return null;
         }
         int mid = start + (end - start) / 2;
         TreeNode left = inorderHelper(start, mid - 1);
         TreeNode treenode = new TreeNode(node.val);
         treenode.left = left;
         node = node.next;//第一次访问到这就是左边已经到头了,才会访问到node节点
         TreeNode right = inorderHelper(mid + 1, end);
         treenode.right = right;
         return treenode;
     }
时间: 2024-10-10 01:58:32

109.Convert sorted list to BST的相关文章

leetcode 109 Convert Sorted List to Binary Search Tree

题目连接 https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ Convert Sorted List to Binary Search Tree Description Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. /** * De

109.Convert Sorted List to Binary Search Tree Leetcode Python

Convert Sorted List to Binary Search Tree Total Accepted: 32343 Total Submissions: 117376 My Submissions Question Solution Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST 这题和convert array t

【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. (二)解题 本题大意:给定一个单向链表,构造出平衡二叉搜索树 解题思路:参考[一天一道Leet

LeeCode 109.Convert Sorted List to Binary Search Tree(将排序链表转化为BST) 解题思路和方法

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 思路:此题与排序数组很大的不同是链表不知道长度以及上面的值.其整体思路还是中间值作为根节点,但是需要一点策略,不然就会超时. 先整体遍历长度之后,将长度保存,这样就不需要每次都遍历链表了. 代码如下: /** * Definition for singly-linked list

109. Convert Sorted List to Binary Search Tree 将一个有序链表转化成BST

看问题,首先想到的解决办法如下: (1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点.后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点: (2)回到原来需要设计的函数: a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回:由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点: b. 找到前驱节点,找到中间节点,完成赋值. c. 在前驱节点和中间节点之间进行切段:为了实现分治递归的用途: d. 递归寻找左节点,右节点:返回根节点: 其中:

[leedcode 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. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ /** * D

Java for LeetCode 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. 解题思路: 同上题,JAVA实现如下: public TreeNode sortedListToBST(ListNode head) { ArrayList<Integer> list=new ArrayList<Integer>(); while(head!=nu

【LeetCode】109&amp; - Convert Sorted List to Binary Search Tree&amp;Convert Sorted Array to Binary Search Tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. Solution 1:  recursion runtime: 28ms. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(i

109. Convert Sorted List to Binary Search Tree (List; Divide-and-Conquer, dfs)

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; struct TreeNode { int val; TreeNode *left; TreeNode *r