最大二叉树
题目要求:
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
最近的学习记录下
当中的主要思想,采用分割
,最大值为中间点,分割左区间和右区间
当中推荐下标索引法,方便快捷
package 二叉树;
public class 二叉树最大值 {
/**
* 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
* 二叉树的根是数组中的最大元素。
* 左子树是通过数组中最大值左边部分构造出的最大二叉树。
* 右子树是通过数组中最大值右边部分构造出的最大二叉树。
*/
//确定递归函数的参数和返回值
/**public TreeNode buildMaxNumBinaryTree(int[] nums){
//1.确定终止条件
TreeNode node=new TreeNode(0);
if(nums.length==1){
node.val=nums[0];
return node;
}
//2.找到数组中的最大值和对应的下标
int max_val=0;
int max_val_index=0;
for(int i=0;i<nums.length;i++){
if(nums[i]>max_val){
max_val=nums[i];
max_val_index=i;
}
}
//3.将根节点赋值
node.val=max_val;
//最大值做区间构造左子树
if(max_val_index>0){
int[] newVec=new int[max_val_index];///TODO:EROOR
node.left=buildMaxNumBinaryTree(newVec);
}
//最大值在下标右区间,构造右子树
if(max_val_index<(nums.length-1)){
int[] newVec=new int[10];//TODO:
node.right=buildMaxNumBinaryTree(newVec);
}
return node;
}
*/
//下标索引法
public TreeNode traversal(int[] nums,int left,int right){
if(left>=right) return null;
//分割点下标
int maxValIndex=left;
for(int i=left+1;i<right;++i){
if(nums[i]>nums[maxValIndex]) maxValIndex=i;
}
TreeNode root=new TreeNode(nums[maxValIndex]);
//左闭右开
root.left=traversal(nums,left,maxValIndex);
//
root.right=traversal(nums,maxValIndex+1,right);
return root;
}
}
完结