有序連結串列轉換二叉搜尋樹
題目描述:給定一個單連結串列,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴
首先,將連結串列轉化成陣列,然後處理過程就和 LeetCode-108-將有序陣列轉換為二叉搜尋樹 的解法完全一樣了。
根據二叉搜尋樹的性質,因為給定的陣列是按升序排列的,所以可以確定陣列num即為該二叉搜尋樹的中序遍歷序列,為了得到一顆平衡的二叉樹,取陣列中間位置的節點作為根節點,這樣,左右子樹的節點較為平衡,具體處理過程如下:
- 呼叫遞迴方法,初始的起始位置為陣列的長度;
- 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹;
- 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是比較均衡的;
- 然後遞迴獲得當前根節點的左右子樹;
- 最後返回根節點即為平衡的二叉搜尋樹。
import com.kaesar.leetcode.ListNode;
import com.kaesar.leetcode.TreeNode;
import java.util.LinkedList;
import java.util.Queue;
public class LeetCode_109 {
public static TreeNode sortedListToBST(ListNode head) {
Queue<Integer> queue = new LinkedList<>();
while (head != null) {
queue.add(head.val);
head = head.next;
}
int[] nums = new int[queue.size()];
int index = 0;
// 先將連結串列轉換成陣列,即為二叉樹的中序遍歷序列
while (!queue.isEmpty()) {
nums[index++] = queue.poll();
}
// 呼叫遞迴方法,初始的起始位置為陣列的長度
return sortedListToBST(nums, 0, nums.length - 1);
}
/**
* 遞迴
*
* @param nums
* @param left
* @param right
* @return
*/
private static TreeNode sortedListToBST(int[] nums, int left, int right) {
// 當起點位置大於終點位置時,說明節點已經遍歷完了,直接返回空樹
if (left > right) {
return null;
}
// 獲取中間位置的值作為根節點,這樣左右子樹的節點樹是較為平衡點
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
// 然後遞迴獲得當前根節點的左右子樹
root.left = sortedListToBST(nums, left, mid - 1);
root.right = sortedListToBST(nums, mid + 1, right);
return root;
}
public static void main(String[] args) {
ListNode head = new ListNode(-10);
head.next = new ListNode(-3);
head.next.next = new ListNode(-0);
head.next.next.next = new ListNode(5);
head.next.next.next.next = new ListNode(9);
sortedListToBST(head).print();
}
}
【每日寄語】 任鐵任金,定有可穿之硯;日磨日削,從無不銳之針。