C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹)
[LeetCode] 109.Convert Sorted List to Binary Search Tree 將有序鏈表轉(zhuǎn)為二叉搜索樹
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9],
One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:
0
/ \
-3 9
/ /
-10 5
這道題是要求把有序鏈表轉(zhuǎn)為二叉搜索樹,和之前那道 Convert Sorted Array to Binary Search Tree 思路完全一樣,只不過是操作的數(shù)據(jù)類型有所差別,一個(gè)是數(shù)組,一個(gè)是鏈表。數(shù)組方便就方便在可以通過index直接訪問任意一個(gè)元素,而鏈表不行。由于二分查找法每次需要找到中點(diǎn),而鏈表的查找中間點(diǎn)可以通過快慢指針來操作,可參見之前的兩篇博客 Reorder List 和 Linked List Cycle II 有關(guān)快慢指針的應(yīng)用。找到中點(diǎn)后,要以中點(diǎn)的值建立一個(gè)數(shù)的根節(jié)點(diǎn),然后需要把原鏈表斷開,分為前后兩個(gè)鏈表,都不能包含原中節(jié)點(diǎn),然后再分別對(duì)這兩個(gè)鏈表遞歸調(diào)用原函數(shù),分別連上左右子節(jié)點(diǎn)即可。代碼如下:
解法一:
class Solution {
public:
TreeNode *sortedListToBST(ListNode* head) {
if (!head) return NULL;
if (!head->next) return new TreeNode(head->val);
ListNode *slow = head, *fast = head, *last = slow;
while (fast->next && fast->next->next) {
last = slow;
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next;
last->next = NULL;
TreeNode *cur = new TreeNode(slow->val);
if (head != slow) cur->left = sortedListToBST(head);
cur->right = sortedListToBST(fast);
return cur;
}
};
我們也可以采用如下的遞歸方法,重寫一個(gè)遞歸函數(shù),有兩個(gè)輸入?yún)?shù),子鏈表的起點(diǎn)和終點(diǎn),因?yàn)橹懒诉@兩個(gè)點(diǎn),鏈表的范圍就可以確定了,而直接將中間部分轉(zhuǎn)換為二叉搜索樹即可,遞歸函數(shù)中的內(nèi)容跟上面解法中的極其相似,參見代碼如下:
解法二:
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if (!head) return NULL;
return helper(head, NULL);
}
TreeNode* helper(ListNode* head, ListNode* tail) {
if (head == tail) return NULL;
ListNode *slow = head, *fast = head;
while (fast != tail && fast->next != tail) {
slow = slow->next;
fast = fast->next->next;
}
TreeNode *cur = new TreeNode(slow->val);
cur->left = helper(head, slow);
cur->right = helper(slow->next, tail);
return cur;
}
};
類似題目:
Convert Sorted Array to Binary Search Tree
參考資料:
https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)將有序鏈表轉(zhuǎn)為二叉搜索樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實(shí)現(xiàn)應(yīng)用與分析
- C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器)
- C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹)
- C++實(shí)現(xiàn)LeetCode(99.復(fù)原二叉搜索樹)
- C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹)
- C++實(shí)現(xiàn)LeetCode(96.獨(dú)一無二的二叉搜索樹)
- C++實(shí)現(xiàn)LeetCode(95.獨(dú)一無二的二叉搜索樹之二)
- C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法
- C++ 超詳細(xì)快速掌握二叉搜索樹
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單而實(shí)用的隨機(jī)密碼生成器,該生成器將生成包含字母、數(shù)字和特殊字符的隨機(jī)密碼,有需要的小伙伴可以參考下2023-11-11
C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法
本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
C語(yǔ)言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析
在C語(yǔ)言中,每一個(gè)正在運(yùn)行的函數(shù)都有一個(gè)棧幀與其對(duì)應(yīng),棧幀中存儲(chǔ)的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等2022-04-04
java 中ArrayList與LinkedList性能比較
這篇文章主要介紹了java 中ArrayList與LinkedList性能比較的相關(guān)資料,需要的朋友可以參考下2017-03-03
設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用
這篇文章主要介紹了設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用,備忘錄模式也經(jīng)常被用來在命令模式中維護(hù)可以撤銷(Undo)操作的狀態(tài),需要的朋友可以參考下2016-03-03
手動(dòng)添加bits/stdc++.h到vs2017的詳細(xì)步驟
這篇文章主要介紹了手動(dòng)添加bits/stdc++.h到vs2017的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)
下面小編就為大家?guī)硪黄P(guān)于C++中定義比較函數(shù)的三種方法小結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10

