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;
}
};