给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:
二叉树的根是数组 nums 中的最大元素。
左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
返回有给定数组 nums 构建的 最大二叉树 。
思路:
本题其实主要就是两个步骤:
1:找到数组nums的最大元素的下标maxPosition
2:创建根节点root
在创建出一个根节点root后,maxPosition把nums分成了两个子数组。之后只需要:
一.将root的右子节点作为一个新的根节点,maxPosition右边部分的子数组作为一个新的数组,重复1、2即可
二.将root的左子节点作为一个新的根节点,maxPosition左边部分的子数组作为一个新的数组,重复1、2即可
然后不断重复以上步骤,直到数组被不断分割到没法再分割就停止
代码如下:
public TreeNode constructMaximumBinaryTree(int[] nums) {
int max=getMax(nums,0,nums.length-1);//获得某个字符子串的最大值的下标
TreeNode root=new TreeNode(nums[max]);
creatMaxTree(root,nums,max+1,nums.length-1,"r");
creatMaxTree(root,nums,0,max-1,"l");
return root;
}
private void creatMaxTree(TreeNode root, int[] nums, int begin, int end, String kid) {
int maxPosition=getMax(nums,begin,end);
if(maxPosition==-1) {
return;
}
if(kid.equals("r")){
root.right=new TreeNode(nums[maxPosition]);
creatMaxTree(root.right,nums,maxPosition+1,end, "r");
creatMaxTree(root.right,nums,begin,maxPosition-1, "l");
}else {
root.left=new TreeNode(nums[maxPosition]);
creatMaxTree(root.left,nums,maxPosition+1,end, "r");
creatMaxTree(root.left,nums,begin,maxPosition-1, "l");
}
}
private int getMax(int[] nums, int begin, int end) {
if(begin>end) return -1;
int key=begin;
for (int i = begin+1; i <=end ; i++) {
if(nums[key]<nums[i]) key=i;
}
return key;
}