问题链接:
https://leetcode.com/problems/maximum-binary-tree/
https://leetcode.com/problems/maximum-binary-tree-ii/
第一问:树构建的过程与以往序列化二叉树构件树的过程基本一致
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/*
0 1 2 3 5 6
*/
public TreeNode constructMaximumBinaryTree(int[] nums) {
if(nums==null || nums.length==0)
return null;
return recursive(nums,0,nums.length-1);
}
public static TreeNode recursive(int[] nums,int start,int end)
{
if(start>end)
return null;
int max_index=start;
for(int i=start;i<=end;i++)
{
if(nums[i]>nums[max_index])
max_index=i;
}
TreeNode p=new TreeNode(nums[max_index]);
p.left=recursive(nums,start,max_index-1);
p.right=recursive(nums,max_index+1,end);
return p;
}
}
第二问:添加一个数字,重新构建最大树,先后序遍历序列化再构建最大树即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public static ArrayList<Integer> record;
public TreeNode insertIntoMaxTree(TreeNode root, int val) {
record=new ArrayList<Integer>();
if(root!=null)
afterOrder(root);
record.add(val);
return build(0,record.size()-1);
}
public static void afterOrder(TreeNode node)
{
if(node==null)
return;
afterOrder(node.left);
record.add(node.val);
afterOrder(node.right);
}
public static TreeNode build(int start,int end)
{
if(start>end)
return null;
int max_index=start;
for(int i=start;i<=end;i++)
{
if(record.get(i)>record.get(max_index))
max_index=i;
}
TreeNode p=new TreeNode(record.get(max_index));
p.left=build(start,max_index-1);
p.right=build(max_index+1,end);
return p;
}
}