Convert Sorted List to Binary Search Tree

来源:互联网 发布:订演唱会门票软件 编辑:程序博客网 时间:2024/04/30 23:09

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

方法1:
递归的每层中都把当前head开始的list从中间切开,然后取中点作为当前的root,然后从head递归得到root->left, 从中点的next开始递归得到root->right

方法2:
先遍历一次得到长度len,然后递归buildTree,通过l,r这两个起始点的index来控制递归的base返回,同时每层递归中都递增head(注意传的是指针的引用);这样一来递归的语义就很清晰了:
a. 如果l > r,说明没有有效节点了,返回NULL
        b, 算的中点m, 然后处理l到m - 1得到以m为根的左树(root->left);
         c.  创建当前root(m), 然后递增head节点(因为当前函数用掉了m来当作root);
         d. 递归得到m + 1到r的右子树(root->right)
        





/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; *//** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode *sortedListToBST(ListNode *head) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        // 1        /*         if (head == NULL) return NULL;        if (head->next == NULL) return new TreeNode(head->val);        ListNode *hi = head->next->next, *mo = head;        while (hi != NULL && hi->next != NULL) {            hi = hi->next->next;            if (hi == NULL) break;            mo = mo->next;        }                hi = mo->next;        TreeNode *root = new TreeNode(hi->val);        mo->next = NULL;        root->left = sortedListToBST(head);        root->right = sortedListToBST(hi->next);        return root;        */                // 2        int len = 0;        ListNode *cur = head;        while (cur != NULL) {            ++len;            cur = cur->next;        }                return buildTree(head, 0, len - 1);    }        TreeNode *buildTree(ListNode *&head, int l, int r) {        if (l > r) return NULL;        int m = l + ((r - l) >> 1);        TreeNode *left = buildTree(head, l, m - 1);        TreeNode *root = new TreeNode(head->val);        head = head->next;        root->left = left;        root->right = buildTree(head, m + 1, r);        return root;    }};   


0 0