力扣刷题 DAY_43 二叉树

Leetcode654

链接:力扣 

题目:

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

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

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例:

思路:

采用前序遍历的思路来做。对于建立一个二叉树,我们要先建立其根结点,然后如此递归的建立其左子树和右子树。

我们根据这个思路将其细化。

1.递归函数的返回值和参数。

每一层递归都要建立以当前最大值为根的二叉树,建立后我们要将子树的根结点返回以提供给上层使用,故返回值采用TreeNode*的指针类型。为了找到当前的最大值,我们不仅要将数组nums传入参数,还需要一个确切的范围[left, right)来确定当前子树结点的范围,同时当前最大值的范围也在该左闭右开区间内寻找。故函数参数共三个(vector<int>& nums, int left, int right)。

2.单层递归逻辑。

对于给定区间[left, right),我们直接遍历该区间内每一个元素,找到其最大值的下标index。以最大值nums[index]建立根结点node,然后将区间又分为左半[left, index)和右半[index+1, right)。然后递归进入左半区间,将其返回结点赋于node的左孩子,递归进入右半区间返回值赋于node的右孩子。

3.递归边界。

当传入参数left >= right的时候,表示区间[left, right)里面已经没有数了,即该子树应为一棵空树。故直接返回nullptr。

参考代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* traversal (vector<int>& nums, int left, int right) {
        if (left >= right) {
            return nullptr;
        }
        int index = left;
        for (int i = left; i < right; i++) {
            if (nums[i] > nums[index]) {
                index = i;
            }
        }
        TreeNode *node = new TreeNode(nums[index]);
        node->left = traversal(nums, left, index);
        node->right = traversal(nums, index + 1, right);
        return node;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return traversal(nums, 0, nums.size());
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值