LeetCode 109 有序鏈表轉換二叉搜索樹 C++

109 有序鏈表轉換二叉搜索樹

給定一個單鏈表,其中的元素按升序排序,將其轉換爲高度平衡的二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定的有序鏈表: [-10, -3, 0, 5, 9],

一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:

在這裏插入圖片描述

方法一

首先要了解什麼是高度平衡二叉搜索樹
題目已經告訴了一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1,做一個不太恰當的比喻就像一根繩子,你想讓它兩邊長度差不多,那麼你要從繩子中間將它拎起來吧,同理這點拎起來的點就是高度平衡二叉搜索樹的根節點,我們要先找到它,然後將根節點的左邊鏈表放到座左子樹裏,右半部分鏈表放進右子樹裏就好了。
2.如何找到根結點這裏可以利用鏈表常見的套路快慢指針來查找,設置快慢指針都從頭結點開始遍歷,慢指針一次走一步,快指針一次走兩步,當快指針走到頭時,慢指針的位置就是鏈表的中點(結點個數爲奇數)或是中間兩個任意一個數(當結點個數爲偶數時)。
3,根據根節點採取遞歸的思想構建左子樹和右子樹,給定列表中的中間元素將會作爲二叉搜索樹的根,該點左側的所有元素遞歸的去構造左子樹,同理右側的元素構造右子樹。這必然能夠保證最後構造出的二叉搜索樹是平衡的。
以奇數點爲例看下圖實例過程
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上述圖片來自力扣官方題解,相信看完這個動畫,應該會更加了解這個流程,接下來上代碼C++版本

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        return buildTree(head,nullptr);
    }
    TreeNode*buildTree(ListNode*head,ListNode*tail)
    {
        if(head==tail) return nullptr;
        ListNode*slow=head;
        ListNode*fast=head;
        while(fast!=tail&&fast->next!=tail)
        {
            slow=slow->next;
            fast=fast->next->next;

        }
        TreeNode*root=new TreeNode(slow->val);
        root->left=buildTree(head,slow);
        root->right=buildTree(slow->next,tail);
        return root;
    }
};

方法二

其核心就是將有序鏈表轉換爲數組去查找中心點,畢竟鏈表查找中心點要遍歷,很耗費時間,而數組查找時間爲O(1),找到後也採取遞歸思想去構建左右子樹,就不展開講解了,如果上一個方法能看懂,這個方法很容易明白
直接上代碼

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        vector<int>v;
        while(head!=nullptr)
        {
            v.push_back(head->val);
            head=head->next;
        }
        return buildTree(v,0,v.size());
    }
    TreeNode*buildTree(vector<int>&v,int begin,int end)
    {
        if(begin==end) return nullptr;
        int mid=(begin+end)/2;
        TreeNode*root=new TreeNode(v[mid]);
        root->left=buildTree(v,begin,mid);
        root->right=buildTree(v,mid+1,end);
        return root;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章