654.最大二叉树

题目描述

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  1. 二叉树的根是数组中的最大元素。
  2. 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  3. 右子树是通过数组中最大值右边部分构造出的最大二叉树。
  4. 通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

1
2
3
4
5
6
7
8
9
10
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:

6
/ \
3 5
\ /
2 0
\
1

题解

先序遍历+递归

这道题经过在大脑中模拟一下二叉树的构建过程可知, 自顶向下更加直观, 所以使用先序遍历的思想. 将左侧数组作为左子树, 右侧数组作为右子树, 这明显递归的过程更加直观

递归思路:

  1. 终止条件: 当数组搜索的左右边界相等时, 递归终止l = r
  2. 递归过程:
    1. 查找出当前数组中的最大值索引, 然后以最大值创建树节点,
    2. 调用 construct(nums, l, max_i) 创建根节点的左孩子。递归执行此操作,创建根节点的整个左子树
    3. 类似的,调用 construct(nums, max_i + 1, r) 创建根节点的右子树
  3. 返回值: 返回创建的root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class lc654 {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return recur(nums, 0, nums.length);
}

private TreeNode recur(int[] nums, int l, int r) {
if (l == r)
return null;
int max_i = maxIndex(nums, l, r);
TreeNode root = new TreeNode(nums[max_i]);
root.left = recur(nums, l, max_i);
root.right = recur(nums, max_i + 1, r);
return root;
}

private int maxIndex(int[] nums, int l, int r) {

int max_i = l;
for (int i = l; i < r; i++) {
if (nums[i] > nums[max_i])
max_i = i;
}

return max_i;
}
}
-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗