题目
题目链接:https://leetcode-cn.com/problems/maximum-binary-tree/
方法递归:
- 将nums数组,l 是左边的边界,r 是右边的边界进行递归
- 如果l 跟 r 相等说明指向同一个数就返回null
- 如果不是,就找出他们这个区间内最大的数
- 将这个值根据树创建结点
- 将这个数左边的边界递归,找出他的左子树
- 将这个数右边的边界递归,找出他的右子树
- 最后返回这个树结点
代码:
/**
* Definition for a binary tree node.
* 树的结点
* public class TreeNode {
* 树的值
* int val;
* 树的左子树
* TreeNode left;
* 树的右子树
* TreeNode right;
* 树的有参构造
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return go(nums,0,nums.length);
}
//递归遍历
//1. 将nums数组,l 是左边的边界,r 是右边的边界进行递归
private TreeNode go(int[] nums, int l, int r) {
//2. 如果l 跟 r 相等说明指向同一个数就返回null
if(l==r)
return null;
//3. 如果不是,就找出他们这个区间内最大的数
int maxnum = max(nums,l,r);
//System.out.println(maxnum);
//4. 将这个值根据树创建结点
TreeNode root = new TreeNode(nums[maxnum]);
//5. 将这个数左边的边界递归,找出他的左子树
root.left = go(nums,l,maxnum);
//6. 将这个数右边的边界递归,找出他的右子树
root.right = go(nums,maxnum+1,r);
//7. 最后返回这个树结点
return root;
}
//判断这个区间的大小
private int max(int[] nums, int l, int r) {
int max = l;
for(int i=l;i<r;i++) {
if(nums[i]>nums[max]) {
max=i;
}
}
return max;
}
}