1. 程式人生 > >Leetcode 108.將有序數組轉化為二叉搜索樹

Leetcode 108.將有序數組轉化為二叉搜索樹

根節點 轉化 clas ont 繼續 right treenode tco 取出

將有序數組轉化為二叉搜索樹

將一個按照升序排列的有序數組,轉換為一棵高度平衡二叉搜索樹。

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

示例:

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

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

0

/ \

-3 9

/ /

-10 5

解題思路:因為給定的數組是按照升序排列的,所以可以先取出數組中間位置的值作為二叉查找樹的根結點,然後以該數組中間位置的值為中心,將左邊的數組劃分到根結點的左子樹中,右邊的數組劃分到根結點的右子樹中,這樣就能保證根結點的左子樹上任意結點的值都小於根結點的值,右子樹上任意結點的值大於根節點的值。接下來,可以使用遞歸地方法繼續取出左邊數組的中間值作為根結點的左子結點,右邊數組的中間值作為根結點的右子結點,然後以左邊數組中間值為中心,再次劃分左右子樹,右邊數組同理,如此遞歸下去,對於每個結點,總是能保證其左子樹上任意結點的值都要小於該節點的值,其右子樹上任意結點的值都要大於該節點的值。

 1 * public class TreeNode {
 2  *     int val;
 3  *     TreeNode left;
 4  *     TreeNode right;
 5  *     TreeNode(int x) { val = x; }
 6  * }
 7  */
 8 class Solution{
 9     public TreeNode sortedArrayToBST(int[] nums){
10         if(nums==null || nums.length==0){
11             return null;
12         }
13 return fun(nums,0,nums.length-1); 14 } 15 16 public TreeNode fun(int[] n,int min,int max){ 17 if(min>max){ 18 return null; 19 } 20 int mid=(min+max)/2; 21 TreeNode node=new TreeNode(n[mid]);//取遞增排序的數組的中間值 22 node.left=fun(n,min,mid-1);
23 node.right=fun(n,mid+1,max); 24 return node; 25 } 26 }

Leetcode 108.將有序數組轉化為二叉搜索樹