109. Convert Sorted List to Binary Search Tree**

109. Convert Sorted List to Binary Search Tree**

https://leetcode.com/problems/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.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted linked list: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
     / \
   -3   9
   /   /
 -10  5

C++ 实现 1

为了产生平衡的 BST, 可以每次找排在中间的节点作为根节点.

下面做法使用了 vector 保存链表中的节点的值.

class Solution {
private:
    TreeNode* convert2BST(const vector<int> &res, int start, int end) {
        if (start > end) return nullptr;
        int mid = start + (end - start) / 2;
        TreeNode *root = new TreeNode(res[mid]);
        root->left = convert2BST(res, start, mid - 1);
        root->right = convert2BST(res, mid + 1, end);
        return root;
    }
public:
    TreeNode* sortedListToBST(ListNode* head) {
        if (!head) return nullptr;
        vector<int> res;
        while (head) {
            res.push_back(head->val);
            head = head->next;
        }
        return convert2BST(res, 0, res.size() - 1);
    }
};

C++ 实现 2

使用快慢指针找到链表的中点. 注意, 下面代码中的 slow 一开始是指向 dummy 的, 如果链表为 1 -> 2 -> NULL, 即只有两个节点的情况, 那么 slow 就会指向 1 而不是 2, 之后使用 slow->next 来得到 2, 即根节点. slow 最终指向根节点前一个节点.

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        if (!head)
            return nullptr;

        ListNode *dummy  = new ListNode(0);
        dummy->next = head;
        // slow 最终指向根节点前一个节点
        ListNode *slow = dummy, *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        // slow->next 存在, 即根节点存在, 那么可以获得根节点的右边的节点
      	// slow->next->next, 并以它开始构建右子树.
        TreeNode *root = new TreeNode(slow->next->val);
        root->right = sortedListToBST(slow->next->next);
        // 这里不要忘了将前半段链表的结尾设为 NULL.
        slow->next = nullptr;
        root->left = sortedListToBST(dummy->next);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值