1. 程式人生 > >[LeetCode]將有序陣列轉換為二叉搜尋樹

[LeetCode]將有序陣列轉換為二叉搜尋樹

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

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

示例:

給定有序陣列: [-10,-3,0,5,9],

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

      0
     / \
   -3   9
   /   /
 -10  5
///////////////////////////////////////////////////////////////////////////////////////////

之前做到過二叉搜尋樹的題目,特點是右子樹比根節點大,左子樹比根節點小。這道題附加了一個條件,要求高度差不超過1。

給的條件是“升序排列”,那思路就有了,直接找陣列中間值作為根節點,因為是升序,中間值的位置就在陣列的中點。用中間值把陣列分割成兩部分,前半部分都是小於中間值的,後半部分都大於中間值。將新得到的兩個陣列繼續做相同的處理,前半部分返回值為左子樹,後半部分的返回值為右子樹。直到陣列長度為1,建立一個節點並賦值為這個長度為1的陣列的值,返回即可。

如果陣列長度為0,返回NULL。

class Solution 
{
public:	
        TreeNode *sortedArrayToBST(vector<int>& nums) {      
        TreeNode *n;		
        TreeNode *root = new TreeNode(0);	
        TreeNode *left = new TreeNode(0);	
        TreeNode *right = new TreeNode(0);	
        vector<int> l;		
        vector<int> r;	
        if (nums.size() == 0)		
            return NULL;	
        if (nums.size()!=1)		
        {        
            l.clear();                       
            r.clear();	                                
            int d;			
            if(nums.size()%2==0)				
                d = nums.size() / 2;			
            else
                d = (nums.size() - 1) / 2;			
            root->val = nums[d];			
            for (int i = 0; i < d; i++)				
                l.push_back(nums[i]);			
            for (int j = d+1; j < nums.size(); j++)			
                r.push_back(nums[j]);			
            left = sortedArrayToBST(l);			
            right = sortedArrayToBST(r);			
            root->left = left;			
            root->right = right;
        }				
        else			
            root->val = nums[0];				
        return root;	
    }
};