Leetcode——108將有序數組轉換爲二叉搜索樹、109將有序鏈表轉換爲二叉搜索樹

108.將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:

給定有序數組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

【思路】
當提到二叉搜索樹,要想到二叉排序樹當左子樹不爲空時,其左子樹上所有關鍵字的值均小於根關鍵字的值;當右子樹不爲空時,其右子樹上所有關鍵字的 值均大於根關鍵字的值;且左右子樹各是一棵二叉排序樹。所以二叉搜索樹的中序遍歷是一個升序排列的數組。所以該有序數組就是該二叉搜索樹的中序遍歷,可以通過中序遍歷+前序遍歷或中序遍歷+後序遍歷來還原二叉樹,中序遍歷主要是來確定左右子樹,前序或後序遍歷是來尋找根節點,不過這裏只知道中序遍歷,但是題上說是一個高度平衡的二叉樹。既然要做到平衡,我們只要把根節點選爲數組的中點即可。 找到根節點然後進行劃分進入遞歸即可。
【實現代碼】

**/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBST(nums,0,nums.length);
    }
    private TreeNode sortedArrayToBST(int[] nums,int start,int end){
        if(start==end) return null;
        int mid=(start+end)>>>1;
        TreeNode root=new TreeNode(nums[mid]);
        root.left=sortedArrayToBST(nums,start,mid);
        root.right=sortedArrayToBST(nums,mid+1,end);
        
        return root;
    }
}

109.給定一個單鏈表,其中的元素按升序排序,將其轉換爲高度平衡的二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:

給定的有序鏈表: [-10, -3, 0, 5, 9],

一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

【思路1】
這個題和108題的區別在於,108題是數組可以直接根據下標訪問到數組的元素,但是鏈表不能直接訪問,所以想到如何得到鏈表的中點,當求單鏈表的中間節點時想到用(雙指針來實現)。於是和108大體思路是一樣的。
【實現代碼】

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head==null) return null;
        ListNode mid=findMidElement(head);
        TreeNode node=new TreeNode(mid.val);
        if(head==mid) return node;
        node.left=sortedListToBST(head);
        node.right=sortedListToBST(mid.next);
        return node;
    }
    
    private ListNode findMidElement(ListNode head){
        ListNode pre=null;
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){
            pre=slow;
            fast=fast.next.next;
            slow=slow.next;
        }
        if(pre!=null){
            pre.next=null;
        }
        return slow;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章