码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-13 11:00:26      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

看问题,首先想到的解决办法如下:

(1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点。后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点;

(2)回到原来需要设计的函数:

       a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回;由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点;

       b. 找到前驱节点,找到中间节点,完成赋值。

       c. 在前驱节点和中间节点之间进行切段;为了实现分治递归的用途;

       d. 递归寻找左节点,右节点;返回根节点;

其中:单独设计函数非常值得一提,因为:2/2 = 1, 3/2 = 1; 4/2 = 2, 5/2 = 2; ~~~  在进行整数除法的时候;

所以,寻找前驱函数的循环设计,需要讲所有情况规约成  偶,奇 一组的样子,而且,由于起点是2,所以每次都是偶在前面,奇在后面;

public class Solution {
    ListNode getLeftNodeFromList(ListNode head){//默认就至少有2个链表节点
        ListNode next = head.next;
        ListNode index = head.next;
        ListNode pre = head;
        while(next != null)
        {
            next = next.next;
            if(next == null) break;
            next = next.next;
            if(next == null) break;
            pre = pre.next;
            index = pre.next;
        }
        return pre;
    }
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null) return null;
        if(head.next == null) return new TreeNode(head.val);
        ListNode left = getLeftNodeFromList(head);
        ListNode mid = left.next;
        left.next = null;
        TreeNode root = new TreeNode(mid.val);
        root.left = sortedListToBST(head);
        root.right = sortedListToBST(mid.next);
        return root;
    }
}

当然,这个办法不是最好的,稍后会讨论最优解,这个解由于利用递归,时间复杂度为:O(N*lgN)

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

标签:

原文地址:http://www.cnblogs.com/ProWhalen/p/5386195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!