您的位置:首页 > 其它

链表——有序链表化为平衡二叉查找树

2016-05-09 14:16 190 查看
比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所以我们需要先找到中间节点,题目中要求如果链表结点数为偶,则中间结点为两个中间结点的后一个。对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度。

代码如下:
 public TreeNode sortedListToBST(ListNode head) {
        if(head == null)  
            return null;

        if(head.next == null){
            return new TreeNode(head.val);
        }
        //用快慢指针找到中间节点
        ListNode slow = head;
        ListNode fast = head;
        ListNode preSlow = null;
        while(fast!= null&&fast.next!=null){
            preSlow = slow;
            slow = slow.next;
            fast = fast.next;
            if(fast!=null&&fast.next!=null)
                {
                fast=fast.next;
            }
        }
        //分别递归左右两部分
        TreeNode mid = new TreeNode(slow.val);
        if(preSlow != null){
            preSlow.next = null;
            mid.left = sortedListToBST(head);
        }
        if(slow.next != null){
            mid.right = sortedListToBST(slow.next);
        }
        return mid;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: