Java 求解最大二叉树

一时失言乱红尘 2022-10-17 00:43 281阅读 0赞

文章目录

    • 一、题目
    • 二、递归分析
    • 三、总结

一、题目

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

  • 二叉树的根是数组 nums 中的最大元素。
  • 左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
  • 右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。

在这里插入图片描述

二、递归分析

题目要求构建最大二叉树,需要每次从数组中寻找处最大值,然后以该最大值为根节点,划分左右数组,继续构建

采用递归法进行解决

(1)确定递归参数和返回值

为了方便,采用记录数组索引,实现每次从数组找出最大值进行构建

  1. createMaxBinaryTree(nums, 0, nums.length - 1);

(2)确定递归终止条件

当左边界大于右边界时表明待处理数组为空,终止

(3)确定单层递归逻辑

待处理数组中寻找到最大值对应的下标,创建该值对应的根节点,再递归创建该值的左子树,递归创建该值的右子树

  1. class Solution {
  2. public TreeNode constructMaximumBinaryTree(int[] nums) {
  3. //数组,待处理数组的左边界,待处理数组的右边界
  4. return createMaxBinaryTree(nums, 0, nums.length - 1);
  5. }
  6. public TreeNode createMaxBinaryTree(int[] nums, int begin, int end) {
  7. if (begin > end) {
  8. return null;
  9. }
  10. //记录最大值的下标
  11. int maxIndex = begin;
  12. //寻找最大值
  13. for (int i = begin; i <= end; i++) {
  14. if (nums[i] > nums[maxIndex]) {
  15. maxIndex = i;
  16. }
  17. }
  18. //创建根节点
  19. TreeNode root = new TreeNode(nums[maxIndex]);
  20. root.left = createMaxBinaryTree(nums, begin, maxIndex - 1);
  21. root.right = createMaxBinaryTree(nums, maxIndex + 1, end);
  22. return root;
  23. }
  24. }

三、总结

该题适用递归解决,同时对于每段数组的划分处理,如果采用数组复制解决,效率低下,可以采用不处理数组,记录数组下标进行处理

发表评论

表情:
评论列表 (有 0 条评论,281人围观)

还没有评论,来说两句吧...

相关阅读

    相关 654.

    给定一个不重复的整数数组 nums。最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前...