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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章