题意理解:
我们需要根据一个数组来构建一个二叉搜索树,且该二叉搜索树也是高度平衡二叉树。
什么是高度平衡二叉树呢? 即对于每个节点来说,左右子树高度差不超过1
思路:我们总是从数组的中间位置作为根节点构建该树,这样就能保证左子树和右子树节点数目差值不超1。
解题方法:
递归 迭代
1.递归
首先明确,我们总是先构造根节点,然后构造左子树,构造右子树。最终返回一棵完整的树。
如果输入的数组为nums长度为0,那么返回一个null。
额外补充一点,对于数组区间的判定经常会出错,可以先规定是左闭右开,还是左开右闭,然后严格按照约定来执行。
public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0) return null;int mid= Math.floorDiv(nums.length,2);TreeNode root=new TreeNode(nums[mid]);TreeNode left=sortedArrayToBST(Arrays.copyOfRange(nums,0,mid));TreeNode right=sortedArrayToBST(Arrays.copyOfRange(nums,mid+1,nums.length));root.left=left;root.right=right;return root;}//方法二
public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToSubBST(nums,0,nums.length);}public TreeNode sortedArrayToSubBST(int[] nums,int left,int right) {if(left>=right) return null;if(right-left==1) return new TreeNode(nums[left]);int mid= left+Math.floorDiv((right-left),2);TreeNode root=new TreeNode(nums[mid]);TreeNode leftNode=sortedArrayToSubBST(nums,left,mid);TreeNode rightNode=sortedArrayToSubBST(nums,mid+1,right);root.left=leftNode;root.right=rightNode;return root;}
2.迭代
迭代法的话,需要进行分析。
为了实现迭代,我们需要三个来进行维护,一个用来维护当前新建节点,一个用来数组左子树下标,另一个用来维护右子树下标。
public TreeNode sortedArrayToBST2(int[] nums) {Queue<TreeNode> nodes=new LinkedList<>();Queue<Integer> leftIndex=new LinkedList<>();Queue<Integer> rightIndex=new LinkedList<>();//初始化TreeNode root=new TreeNode();nodes.offer(root);leftIndex.offer(0);rightIndex.offer(nums.length-1);//为了实现迭代使用三个数组while(!nodes.isEmpty()){//创建根节点TreeNode curNode=nodes.poll();int left=leftIndex.poll();int right=rightIndex.poll();int mid=Math.floorDiv((left+right),2);curNode.val=nums[mid];//处理左区间if(left<=mid-1){curNode.left=new TreeNode();nodes.offer(curNode.left);leftIndex.offer(left);rightIndex.offer(mid-1);}//处理右区间if(right>=mid+1){curNode.right=new TreeNode();nodes.offer(curNode.right);leftIndex.offer(mid+1);rightIndex.offer(right);}}return root;}
3.分析
时间复杂度:
递归:O(n)
迭代:O(n)
空间负责度:
递归:O(n)
迭代:O(3n)