首页 » 编程之美 » 正文

[leetcode_109]Convert Sorted List to Binary Search Tree

这个题是http://blog.sina.com.cn/s/blog_672f71fc0101os5r.html
该题目的变形,只是把数组换成了单链表,在单链表查找的时候注意优化,每次二分之后head节点对于left来说依然是head,但是对right来说head节点要更新为mid的那个节点。不然会超时。

class Solution {
public:
    ListNode * GetListNthNode(ListNode * head,int n) {
        int k = 0;
        while(k < n) {
            k++;
            head = head->next;
        }
        return head;
    }
    int CountList(ListNode *head) {
        int count = -1;
        while(head != NULL) {
            head = head->next;
            count++;
        }
        return count;
    }
    TreeNode *BSearchT(int left,int right,ListNode * head) {
        if(right < left)return NULL;
        int mid = (left+right) / 2;
        TreeNode * root = new TreeNode(GetListNthNode(head,mid-left)->val);
        root->left = BSearchT(left,mid-1,head);
        root->right = BSearchT(mid+1,right,GetListNthNode(head,mid+1-left));
        return root;
    }
    TreeNode *sortedListToBST(ListNode *head) {
        if(head == NULL)
            return NULL;
        int n = CountList(head);
        int mid = (0 + n) / 2;
        TreeNode * root = new TreeNode(GetListNthNode(head,mid)->val);
        root->left = BSearchT(0,mid-1,head);
        root->right = BSearchT(mid+1,n,GetListNthNode(head,mid+1));
        return root;
    }
};

发表评论