LeetCode系列之「有序連結串列轉換二叉搜尋樹」
給定一個單連結串列,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序連結串列: [-10, -3, 0, 5, 9],
一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
0
/ \
-3 9
/ /
-10 5
思路:分治思想
快慢指標找出中間節點mid
,將中間節點作為樹的根節點。
斷開mid
前後指標,至於前指標,我們要維護一個slow
的前節點。所以還要建立一個虛節點。
找出中節點mid
後,對於左邊和右邊進行相同的操作。
Java實現如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head == null) return null;
ListNode slow = head;
ListNode fast = head;
ListNode mid = null;
ListNode head2 = null;
ListNode vHead1 = new ListNode(-1);
vHead1.next = head;
ListNode vHead2 = new ListNode(-2);
ListNode pre = vHead1;
while(fast.next != null && fast.next.next != null){
pre = pre.next;
slow = slow.next;
fast = fast.next.next;
}
mid = slow;
pre.next = null;
vHead2 = mid.next;
mid.next = null;
TreeNode treeHead = new TreeNode(mid.val);
if(vHead1.next != null) treeHead.left = sortedListToBST(vHead1.next);
if(vHead2.next != null) treeHead.right = sortedListToBST(vHead2.next);
return treeHead;
}
}
相關文章
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- LeetCode-108-將有序陣列轉換為二叉搜尋樹LeetCode陣列
- LeetCode 108. 將有序陣列轉換為二叉搜尋樹LeetCode陣列
- Python教程:將有序陣列轉換為二叉搜尋樹Python陣列
- leetcode 108.將有序陣列轉換為二叉搜尋樹 JavaLeetCode陣列Java
- 有序表和搜尋二叉樹二叉樹
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- 程式碼隨想錄 第23天 | 669. 修剪二叉搜尋樹 ● 108.將有序陣列轉換為二叉搜尋樹 ● 538.把二叉搜尋樹轉換為累加樹 ● 總結篇陣列
- 程式碼隨想錄演算法訓練營day23 | leetcode 669. 修剪二叉搜尋樹、108. 將有序陣列轉換為二叉搜尋樹、538. 把二叉搜尋樹轉換為累加樹演算法LeetCode陣列
- Hash連結串列轉換為紅黑樹,和樹轉換為連結串列的條件
- 資料結構之「二叉搜尋樹」資料結構
- 程式碼隨想錄演算法訓練營第23天 | 669. 修剪二叉搜尋樹、108.將有序陣列轉換為二叉搜尋樹、538.把二叉搜尋樹轉換為累加樹演算法陣列
- 程式碼隨想錄演算法訓練營,9月17日 | 669. 修剪二叉搜尋樹,108.將有序陣列轉換為二叉搜尋樹,538.把二叉搜尋樹轉換為累加樹演算法陣列
- 二叉搜尋樹的結構
- 將二叉排序樹BST轉換成排序的雙向連結串列排序
- 微軟面試題,將二叉排序樹轉換成雙向連結串列微軟面試題排序
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- 二叉搜尋樹
- Python演算法練習--把搜尋樹轉成雙向連結串列Python演算法
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 【LeetCode二叉樹#17】在二叉搜尋樹中插入或刪除某個值(涉及重構二叉樹、連結串列基礎、以及記憶體洩漏問題)LeetCode二叉樹記憶體
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 二叉樹展開為連結串列二叉樹
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- 資料結構學習系列之二叉搜尋樹詳解!資料結構