109. 有序連結串列轉換二叉搜尋樹
阿新 • • 發佈:2022-05-29
109. 有序連結串列轉換二叉搜尋樹
給定一個單鏈表的頭節點 head
,其中的元素 按升序排序 ,將其轉換為高度平衡的二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差不超過 1。
示例 1:
輸入: head = [-10,-3,0,5,9]
輸出: [0,-3,9,-10,null,5]
解釋: 一個可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜尋樹。
示例 2:
輸入: head = []
輸出: []
提示:
-
head
中的節點數在[0, 2 * 104]
範圍內 -105 <= Node.val <= 105
思路:
首先,構造一個BST需要做到樹的左節點的值都小於根節點,右節點值都大於根節點。可以吧連結串列轉化為陣列進行操作
需要保證高度差不超過1,那麼每次取中間值即可。
class Solution { public: TreeNode* sortedListToBST(ListNode* head) { if(head==nullptr)return nullptr; vector<int>v;//儲存節點值 ListNode* p=head; while(p!=nullptr){ v.push_back(p->val); p=p->next; } //使用陣列構造高度平衡的二叉樹 return buildBST(v,0,v.size()-1); } TreeNode* buildBST(vector<int>&v,int left,int right){ if(left>right)return nullptr;//越界就為空節點 int mid=left+(right-left)/2;//取中間值 TreeNode* root=new TreeNode(v[mid]); root->left=buildBST(v,left,mid-1); root->right=buildBST(v,mid+1,right); return root; } };