LeetCode:Convert Sorted Array(List) to Binary Search Tree

来源:互联网 发布:凸轮弹簧机编程 编辑:程序博客网 时间:2024/05/16 10:26

108. Convert Sorted Array to Binary Search Tree


Given an array where elements are sorted in ascending order, convert it to a height balanced BST.


/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* sortedArrayToBST(vector<int>& nums) {        int sz=nums.size();        if(nums.empty())    return nullptr;        int mid=sz/2;        TreeNode *root=new TreeNode(nums[mid]);        vector<int> left(nums.begin(),nums.begin()+mid);        root->left=sortedArrayToBST(left);        vector<int> right(nums.begin()+mid+1,nums.end());        root->right=sortedArrayToBST(right);        return root;    }/*总结:*1、没有要求用非递归,一般递归解决;*2、要求非递归,先将递归形式写出,然后改。*3、递归有助于理解。*/};

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. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; *//** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* sortedListToBST(ListNode* head) {        vector<int> nums;        for(ListNode *p=head;p!=nullptr;p=p->next)        {            nums.push_back(p->val);        }        return sortedArrayToBST(nums);    }private:    TreeNode* sortedArrayToBST(vector<int>& nums) {        int sz=nums.size();        if(nums.empty())    return nullptr;        int mid=sz/2;        TreeNode *root=new TreeNode(nums[mid]);        vector<int> left(nums.begin(),nums.begin()+mid);        root->left=sortedArrayToBST(left);        vector<int> right(nums.begin()+mid+1,nums.end());        root->right=sortedArrayToBST(right);        return root;    }};

Reference:
https://discuss.leetcode.com/topic/8141/share-my-o-1-space-and-o-n-time-java-code
看了这段代码后,我发现别人写的很巧妙。
下面贴出来写点注释。

private ListNode node;public TreeNode sortedListToBST(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;    /*以中序遍历的形式,在生成父节点之前已经到达BST最左    *然后一次一次生成父节点,到达最外围时候    *node已经跑到了链表中点    */    TreeNode right = inorderHelper(mid + 1, end);    treenode.right = right;    return treenode;}
0 0