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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值