首页 > 试题广场 >

将升序数组转化为平衡二叉搜索树

[编程题]将升序数组转化为平衡二叉搜索树
  • 热度指数:32700 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个升序排序的数组,将其转化为平衡二叉搜索树(BST).

平衡二叉搜索树指树上每个节点 node 都满足左子树中所有节点的的值都小于 node 的值,右子树中所有节点的值都大于 node 的值,并且左右子树的节点数量之差不大于1

数据范围:,数组中每个值满足
进阶:空间复杂度 ,时间复杂度

例如当输入的升序数组为[-1,0,1,2]时,转化后的平衡二叉搜索树(BST)可以为{1,0,2,-1},如下图所示:
或为{0,-1,1,#,#,#,2},如下图所示:
返回任意一种即可。
示例1

输入

[-1,0,1,2]

输出

{1,0,2,-1}
示例2

输入

[]

输出

{}

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
脑溢血做法:只考虑平衡和搜索性,不考虑深度:

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return TreeNode类
     */
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums == null || nums.length == 0)
            return null;
       if(nums.length <= 1)
            return new TreeNode(nums[0]);
        // write code here
        TreeNode root = new TreeNode(nums[nums.length / 2]);
        TreeNode currNode = root;

        for (int i =  nums.length / 2; i >=0; i--) {
            currNode.left = new TreeNode(nums[i]);
            currNode = currNode.left;
        }

        currNode = root;
        // right
        for (int i = nums.length/2 + 1; i < nums.length; i++) {
            currNode.right = new TreeNode(nums[i]);
            currNode = currNode.right;
        }

        return root;
    }
}

最优解:考虑深度最低时
说明: 关键是如何找到正确的左节点和右节点,根节点肯定是中间元素对应的节点,它的左节点也应该是某个子树的根节点,而这个根节点为了达到左右平衡,应该也要选择中间节点作为根节点,当所有的子树都是平衡的时候,整个树也是平衡的,因此这是个深度优先递归问题:

public TreeNode sortedArrayToBST(int[] nums) {
    if (nums == null || nums.length == 0) {
        return null;
    }
    return buildBST(nums, 0, nums.length - 1);
}

private TreeNode buildBST(int[] nums, int start, int end) {
    if (start > end) {
        return null;
    }
    int mid = start + (end - start) / 2;
    TreeNode root = new TreeNode(nums[mid]);
    root.left = buildBST(nums, start, mid - 1);
    root.right = buildBST(nums, mid + 1, end);
    return root;
}

总结:这道题简单,但初次尝试也很难想到最优解

发表于 2024-05-31 13:18:48 回复(0)
public TreeNode sortedArrayToBST (int[] nums) {
    // write code here
    if(nums==null || nums.length==0){
        return null;
    }
    int len=nums.length ,mid=len/2;
    TreeNode root=new TreeNode(nums[mid]);
    root.left=sortedArrayToBST(Arrays.copyOfRange(nums ,0 ,mid));
    root.right=sortedArrayToBST(Arrays.copyOfRange(nums ,mid+1 ,len));
    return root;
}

编辑于 2024-03-17 15:16:12 回复(0)
这是一个中序遍历的问题,果然简单题目就是简单题目,不用考虑太多 只需要考虑如何利用中序实现遍历
Arrays复制数组有个坑左闭右开
import java.util.*;
public class Solution {
    public TreeNode sortedArrayToBST (int[] num) {
        // write code here
        // 左小右大
        if(num.length==0)return null;
        if(num.length==1)return new TreeNode(num[0]);
        int mid = num.length/2;
        int l_cursor = mid-1;
        int r_cursor = mid+1;
        TreeNode root = new TreeNode(num[mid]);
        if(l_cursor>=0)root.left = sortedArrayToBST(Arrays.copyOfRange(num, 0, l_cursor+1));
        if(r_cursor<num.length)root.right = sortedArrayToBST(Arrays.copyOfRange(num, r_cursor, num.length));
        return root;
    }
}
// 运行时间:125ms    超过53.47% 用Java提交的代码
// 占用内存:16176KB    超过19.78%用Java提交的代码


发表于 2022-03-08 13:16:46 回复(0)
递归,简单易懂
import java.util.*;

public class Solution {

    public TreeNode sortedArrayToBST (int[] num) {
        int n = num.length;
        if (n == 0){
            return null;
        }
        int mid = n >> 1;
        TreeNode root = new TreeNode(num[mid]);
        root.left = sortedArrayToBST(Arrays.copyOfRange(num, 0, mid));
        root.right = sortedArrayToBST(Arrays.copyOfRange(num, mid + 1, n));
        return root;
    }
}


发表于 2022-01-21 13:42:48 回复(0)
递归
public TreeNode sortedArrayToBST (int[] num) {
    return dfs(num, 0, num.length);
}

public TreeNode dfs(int[] num, int begin, int end){
    if(begin >= end)  return null;
    int mid = (begin+end)>>1;
    TreeNode node = new TreeNode(num[mid]);
    node.left = dfs(num, begin, mid);
    node.right = dfs(num, mid+1, end);
    return node;
}


发表于 2021-10-08 17:31:48 回复(0)
使用递归的思想进行递归,首先需要先通过找到中间点作为根节点进行递归
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param num int整型一维数组 
     * @return TreeNode类
     */
    public TreeNode sortedArrayToBST (int[] num) {
        // write code here
        if(num.length==0)
            return null;
        return sortBST(num,0,num.length-1);
    }
    public TreeNode sortBST(int[] num,int start,int end){
        if(start>end)
            return null;
        //首先获取中间节点作为当前节点
        int mid=(start+end+1)/2;
        TreeNode root=new TreeNode(num[mid]);
        //使用递归的模式进行递归
        root.left=sortBST(num,start,mid-1);
        root.right=sortBST(num,mid+1,end);
        return root;
    }
}

发表于 2021-10-04 12:12:29 回复(0)
public class Solution22 {
	public TreeNode sortedArrayToBST(int[] num) {
        if(num==null||num.length==0)
        	return null;
        return sorted(num,0,num.length-1);
    }
    
    public TreeNode sorted(int[] num,int left,int right) {
    	 if(left>right)
    		 return null;
       	 int mid =(left+right+1)/2;
    	 int num1 =num[mid];
    	 TreeNode node = new TreeNode(num1);
    	 node.left =sorted(num,left,mid-1);
    	 node.right = sorted(num,mid+1,right);
    	 return node;
    }

}

发表于 2020-04-30 10:28:07 回复(0)
。。
import java.util.Arrays;
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if(num.length == 0)
            return null;
        if(num.length == 1)
            return new TreeNode(num[0]);
        if(num.length == 2)
        {
            TreeNode root = new TreeNode(num[1]);
            root.left = new TreeNode(num[0]);
            return root;
        }
        int length = num.length;
        int middle = length/2;
        TreeNode root = new TreeNode(num[middle]);
        int[] numLeft = Arrays.copyOfRange(num, 0, middle);
        int[] numRight = Arrays.copyOfRange(num, middle + 1, length);
        root.left = sortedArrayToBST(numLeft);
        root.right = sortedArrayToBST(numRight);
        return root;
    }
}

发表于 2020-01-17 13:17:17 回复(0)
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if (num == null)
            return null;
        return arrToBST(num, 0, num.length);
    }

    private TreeNode arrToBST(int[] num, int low, int high) {
        if (low < high && low < num.length) {
            int rootIndex = (low + high) / 2;
            TreeNode root = new TreeNode(num[rootIndex]);
            root.left = arrToBST(num, low, rootIndex);
            root.right = arrToBST(num, rootIndex+1, high);
            return root;
        }
        return null;
    }
}
发表于 2018-04-02 11:37:19 回复(0)
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        int len = num.length;
        return toBST(num,0,len);
    }
    
    public TreeNode toBST(int[] num,int start,int end){
        if(start == end) return null;
        int mid = (start + end) / 2;
        TreeNode root = new TreeNode(num[mid]);
        root.left = toBST(num,start,mid);
        root.right = toBST(num,mid + 1,end);
        return root;
    }
}

发表于 2017-08-21 00:26:50 回复(0)
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        
        if(num.length==0){
            
            return null;
        }
        

        return sortedArray(num,0,num.length-1);
        
        
    }
    
    
    public TreeNode sortedArray(int[] num,int left,int right) {
        
        if(left<0 || right>=num.length || left>right){
            return null;
        }
        
        int mid=(right+left)/2;
        
        if( (right-left)%2!=0 ){
            mid+=1;
        }
        
        TreeNode head=new TreeNode(num[mid]);
        
        head.left=sortedArray(num,left,mid-1);
        head.right=sortedArray(num,mid+1,right);
        
        return head;
        
        
        
        
        
    }

}
发表于 2017-08-19 14:50:27 回复(1)
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if (num == null || num.length == 0)
            return null;
        return sortedArrayToBST(num, 0, num.length - 1);
    }
    public TreeNode sortedArrayToBST(int[] num, int start, int end) {
        if (start > end)
            return null;
        if (start == end)
            return new TreeNode(num[start]);
        int mid = 0;
        if ((start + end) % 2 == 0) {
            mid = (start + end) / 2;
        } else {
            mid = (start + end) / 2 + 1;
        }
        TreeNode root = new TreeNode(num[mid]);
        TreeNode leftTree = null;
        TreeNode rightTree = null;
        if (mid - 1 >= 0 && mid >= start)
            leftTree = sortedArrayToBST(num, start, mid - 1);
        if (mid + 1 < num.length && mid + 1 <= end)
            rightTree = sortedArrayToBST(num, mid + 1, end);
        root.left = leftTree;
        root.right = rightTree;
        return root;
    }
}

发表于 2017-08-06 22:05:28 回复(0)
/*递归思路:1.f(p,end)找到链表(起始p,到终止end)中最中间的节点,作为根节点,并返回。
           2.这个节点的left=f(p,中间节点)
           3.这个节点的right=f(中间节点.next,end)
*/      
public class Solution {
    public TreeNode sortedListToBST(ListNode head) {
       return  f(head,null);
    }
    public TreeNode f(ListNode p,ListNode end){
         if(p==null||p==end) return null;
         if(p.next==end) return new TreeNode(p.val);
        ListNode slow=p;
        ListNode fast=p;
        while(fast.next!=end && fast.next.next!=end){
            slow=slow.next;
            fast=fast.next.next;
        }
        if(fast.next!=end) //边界值处理
        slow=slow.next;
        TreeNode root  = new TreeNode(slow.val);
        root.left=f(p,slow);
        root.right=f(slow.next,end);
        return root;
    }
} 

发表于 2017-07-26 10:37:03 回复(1)
public TreeNode sortedArrayToBST(int[] num) { if (num.length == 0) { return null; } TreeNode head = helper(num, 0, num.length - 1); return head; } public TreeNode helper(int[] num, int low, int high) { if (low > high) { // Done return null; } int mid = (low + high) / 2; TreeNode node = new TreeNode(num[mid]); node.left = helper(num, low, mid - 1); node.right = helper(num, mid + 1, high); return node; }

发表于 2017-03-12 10:50:26 回复(0)
public class Solution {
   public TreeNode sortedArrayToBST(int[] num) {
		if(num == null || num.length == 0) return null;
		return createTree(num, 0, num.length - 1);
	}
	public static TreeNode createTree(int[] num, int start, int end) {
		if(start > end) return null;
		int mid = (start + end) / 2 + (start + end) % 2;
		TreeNode root = new TreeNode(num[mid]);
		root.left = createTree(num, start, mid - 1);
		root.right = createTree(num, mid + 1, end);
		return root;
	}
}

发表于 2016-11-01 19:05:44 回复(2)