1. 程式人生 > 其它 >刷題-力扣-654. 最大二叉樹

刷題-力扣-654. 最大二叉樹

654. 最大二叉樹

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/maximum-binary-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

給定一個不含重複元素的整數陣列 nums 。一個以此陣列直接遞迴構建的 最大二叉樹 定義如下:

二叉樹的根是陣列 nums 中的最大元素。
左子樹是通過陣列中 最大值左邊部分 遞迴構造出的最大二叉樹。
右子樹是通過陣列中 最大值右邊部分 遞迴構造出的最大二叉樹。
返回有給定陣列 nums 構建的 最大二叉樹 。

示例 1:

輸入:nums = [3,2,1,6,0,5]
輸出:[6,3,5,null,2,0,null,null,1]
解釋:遞迴呼叫如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左邊部分是 [3,2,1] ,右邊部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左邊部分是 [] ,右邊部分是 [2,1] 。
        - 空陣列,無子節點。
        - [2,1] 中的最大值是 2 ,左邊部分是 [] ,右邊部分是 [1] 。
            - 空陣列,無子節點。
            - 只有一個元素,所以子節點是一個值為 1 的節點。
    - [0,5] 中的最大值是 5 ,左邊部分是 [0] ,右邊部分是 [] 。
        - 只有一個元素,所以子節點是一個值為 0 的節點。
        - 空陣列,無子節點。

示例 2:

輸入:nums = [3,2,1]
輸出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整數 互不相同

題目分析

  1. 根據題目描述構造二叉樹
  2. 先獲取最大值構造根節點,再在左側獲取左側的最大值構造左孩子,在左側獲取右側的最大值構造右孩子

程式碼

/**
 * 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* constructMaximumBinaryTree(vector<int>& nums) {
        return createNode(nums, 0, nums.size() - 1);
    }


private:
    TreeNode* createNode(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int n = left;
        for (int i = left; i <= right; ++i) {
            n = nums[n] > nums[i] ? n : i;
        }
        return new TreeNode(nums[n], createNode(nums, left, n - 1), createNode(nums, n + 1, right));
    }
};