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;
}
}