前言
在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接
题目
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
1.构造二叉树-递归(区间,左闭右开)
在递归构造二叉树时,在每次递归的时候不用重复切割数组,递归的时候用数组左右下标表示当前数组的范围(用来替代赋值一个新的二叉树)
2. 本题思路分析:
此题可以使用递归遍历,
三部曲:
- 第一步确定参数和返回值
参数:数组,以及表示当前数组范围的左右两个int类型值(begin,end),作为数组的左右范围(这里是左闭右开)
返回值:根节点 - 第二步截止递归的条件
递归允许空节点进入,所以这里要判断空节点进入后的返回逻辑;
如果是空节点进入,那么也就是end>=begin时,返回null;
在这里也可以处理叶子结点的特殊情况,当end = begin + 1时,为叶子结点,直接用当前的值构造一个TreeNode类型对象返回。 - 第三步单层递归逻辑
找到当前数组中最大的值,下标为maxIndex,用其值创建一个新的TreeNode,递归左右孩子,左孩子的数组范围为:begin,maxIndex;右孩子的范围:maxIndex+1,end。
3. 算法实现
public TreeNode constructMaximumBinaryTree(int[] nums) {
return travalBinaryTree(nums,0,nums.length);
}
//左闭右开
public TreeNode travalBinaryTree(int[] nums,int begin,int end) {
if(begin + 1 == end){
TreeNode cur = new TreeNode(nums[begin]);
return cur;
}else if(begin >= end){
return null;
}
int maxIndex = findMaxIndex(nums,begin,end);
TreeNode tree = new TreeNode(nums[maxIndex]);
tree.left = travalBinaryTree(nums,begin,maxIndex);
tree.right = travalBinaryTree(nums,maxIndex + 1,end);
return tree;
}
public int findMaxIndex(int[] nums,int begin,int end){
int maxVal = nums[begin];
int maxIndex = begin;
for(int i = begin;i < end;i++){
if(nums[i] > maxVal){
maxVal = nums[i];
maxIndex = i;
}
}
return maxIndex;
}
4. 算法复杂度
暂无
5. 算法坑点
暂无