【D2】將有序數(shù)組轉(zhuǎn)換為二叉搜索樹 & 有序鏈表轉(zhuǎn)換二叉搜索樹 (LC 108&109)

108. 將有序數(shù)組轉(zhuǎn)換為二叉搜索樹

問題描述

將一個按照升序排列的有序數(shù)組,轉(zhuǎn)換為一棵高度平衡二叉搜索樹。一個高度平衡二叉樹是指一個二叉樹每個節(jié)點 的左右兩個子樹的高度差的絕對值不超過 1。

解題思路

遞歸思路。選取升序排列數(shù)組里的中間值作為根節(jié)點,然后分別用medium的前/后半部分作為參數(shù)遞歸構(gòu)建左/右子樹。(如果元素個數(shù)為偶數(shù)時,那么選擇右邊的那個數(shù)作為中間值)

代碼實現(xiàn)

/**
 * 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 sortedArrayToBST(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return null;
        }
        int mediumIndex = len/2;
        TreeNode root = new TreeNode(nums[mediumIndex]);

        //構(gòu)建左子樹
        if(mediumIndex == 0){
            root.left = null;
        }else{
            int[] left = new int[mediumIndex];
            for(int i = 0; i < mediumIndex; i++){
                left[i] = nums[i];
            }
            root.left = sortedArrayToBST(left);
        }

        //構(gòu)建右子樹
        if(mediumIndex == len - 1){
            root.right =null;
        }else{
            int[] right = new int[len - mediumIndex - 1];
            for(int i = 0; i < len - mediumIndex - 1; i++){
                right[i] = nums[i + mediumIndex + 1];
            }
            root.right = sortedArrayToBST(right);
        }

        return root;
    }
}

109. 有序鏈表轉(zhuǎn)換二叉搜索樹

問題描述

給定一個單鏈表,其中的元素按升序排序,將其轉(zhuǎn)換為高度平衡的二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節(jié)點 的左右兩個子樹的高度差的絕對值不超過 1。

解題思路

基本思路與上一題相同,采用快慢指針找到升序鏈表的中間節(jié)點。

代碼實現(xiàn)

/**
 * 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, fast = head;
        // 開辟新的空間存儲左子樹節(jié)點
        ListNode left = new ListNode(0);
        ListNode leftHead = left;
        //先遍歷找到鏈表的中間節(jié)點
        while(fast != null && fast.next != null){
            left.next = new ListNode(slow.val);
            left = left.next;
            slow = slow.next;
            fast = fast.next.next;
        }
        TreeNode root = new TreeNode(slow.val);
        root.left = sortedListToBST(leftHead.next);
        root.right = sortedListToBST(slow.next);
        return root;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容