DFS
class Solution {
int[] arr;
HashMap<Integer,Integer> map = new HashMap<>();
public TreeNode constructMaximumBinaryTree(int[] nums) {
arr = nums.clone();
for(int i = 0; i < nums.length;i++) {
map.put(nums[i],i);
}
Arrays.sort(arr);
return build(0,arr.length - 1, arr.length - 1,nums);
}
public TreeNode build(int l, int r,int start,int[] nums){
int tmp = 0;
TreeNode node = new TreeNode();
while(start >= 0){
tmp = map.getOrDefault(arr[start],0);
if(tmp >= l && tmp <= r){
break;
}
start--;
}
if(start >= 0){
start--;
node.val = nums[tmp];
node.left = build(l,tmp - 1,start,nums);
node.right = build(tmp + 1, r,start,nums);
return node;
} else {
return null;
}
}
}
思路:
1.设置全局变量HashMap保存nums数组的下标和值的对应关系,arr储存升序的数组nums。
2.使用DFS遍历,先取arr数组中的最大值,在map里找下标,如果下标在给定的左右下标范围内,则取出这个下标,生成该接点,左节点为 l - tmp - 1,右节点为 tmp + 1, r 由于当前l至r的下标内,nums[tmp]是最大值,所以子节点可以从start--开始。
再来个改进版
class Solution {
int maxValue;
int maxValueIndex;
public TreeNode constructMaximumBinaryTree(int[] nums) {
return build(0,nums.length - 1,nums);
}
public TreeNode build(int l, int r,int[] nums){
if(l > r) return null;
maxValue = nums[l];
maxValueIndex = l;
TreeNode node = new TreeNode();
for(int i = l + 1; i <= r; i++){
if(maxValue < nums[i]){
maxValue = nums[i];
maxValueIndex = i;
}
}
//这里要把maxValueIndex 传值给 mid,因为maxValueIndex是个全局变量会一直被递归函数修改,node.left运行完后,node.right
//如果用的是maxValueIndex,不是当前函数的值,已经被上面的递归函数修改了
int mid = maxValueIndex;
node.val = maxValue;
if(l == r) return node;
node.left = build(l,mid - 1,nums);
node.right = build(mid + 1, r,nums);
return node;
}
}
这里最大值未必要排序后依次寻找,建立hashmap每次都去读一遍很麻烦,还不如直接子函数扫一遍,记录最大值。