LeetCode109 Convert Sorted List to Binary Search Tree有序链表转二叉搜索树

109 Convert Sorted List to Binary Search Tree题目链接

核心: 快慢指针
快慢指针的使用方法可参考该博客:快慢指针法玩转链表算法面试
本题方便在已经给出了排好序的链表,那么只需要逐个递归进行二分成树即可。

一开始小李看到AVL tree时候第一想法是通过逐个插入构建AVL tree,无奈懒得将AVL tree的旋转写一遍(而且,调整平衡的时候需要考虑树的高度,but definition for a binary tree node 并没有给树的高度,小李懒得解决了),so,写了下面这个东西出来。

class Solution {
public:
    
    TreeNode* sortedListToBST(ListNode* head) {
        ListNode* tail = nullptr;
        return BST(head, tail);
    }
    TreeNode* BST(ListNode* head, ListNode* tail){
        if(head == nullptr) return nullptr;//链表为空情况
        if(head->next == nullptr) return new TreeNode(head->val); //链表只有一个值
        ListNode *start = new ListNode(0);
        start->next = head;
        //这里注意一下, 一开始我没有想设置start 直接上来就fast slow = head 跑的时候出现了和预期答案不服的情况 eg: [1,2] 我的输出[2,1] 预期[1,null,2]
        ListNode *fast = start, *slow = start, *preSlow = nullptr;
        while((fast != nullptr) && (fast->next != nullptr)){
            preSlow = slow;
            slow = slow->next;
            fast = (fast->next)->next; 
        }
        TreeNode* root = new TreeNode(slow->val);
        preSlow->next = nullptr;
        root->left = BST(start->next, tail);
        root->right = BST(slow->next, tail);
        return root;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章