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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值