[LeetCode] 654. Maximum Binary Tree 最大二叉树
Given an integer array with no duplicates. A maximum tree building on this array is defined as follow:
- The root is the maximum number in the array.
- The left subtree is the maximum tree constructed from left part subarray divided by the maximum number.
- The right subtree is the maximum tree constructed from right part subarray divided by the maximum number.
Construct the maximum tree by the given array and output the root node of this tree.
Example 1:
- Input: [3,2,1,6,0,5]
- Output: return the tree root node representing the following tree:
- 6
- / \
- 3 5
- \ /
- 2 0
- \
- 1
Note:
- The size of the given array will be in the range [1,1000].
给一个数组,以数组中的最大值为根结点创建一个最大二叉树,分隔出的左右部分再分别创建最大二叉树。
解法:递归
Java:
- public class Solution {
- public TreeNode constructMaximumBinaryTree(int[] nums) {
- if (nums == null) return null;
- return build(nums, 0, nums.length - 1);
- }
- private TreeNode build(int[] nums, int start, int end) {
- if (start > end) return null;
- int idxMax = start;
- for (int i = start + 1; i <= end; i++) {
- if (nums[i] > nums[idxMax]) {
- idxMax = i;
- }
- }
- TreeNode root = new TreeNode(nums[idxMax]);
- root.left = build(nums, start, idxMax - 1);
- root.right = build(nums, idxMax + 1, end);
- return root;
- }
- }
Java:
- public TreeNode constructMaximumBinaryTree(int[] nums) {
- return construct(nums, 0, nums.length);
- }
- TreeNode construct(int[] nums, int l, int r) {
- if (l >= r) return null;
- int maxi = l;
- for (int i = l + 1; i < r; i++) if (nums[i] > nums[maxi]) maxi = i;
- TreeNode root = new TreeNode(nums[maxi]);
- root.left = construct(nums, l, maxi);
- root.right = construct(nums, maxi + 1, r);
- return root;
- }
Python:
- def constructMaximumBinaryTree(self, nums):
- if not nums:
- return None
- root, maxi = TreeNode(max(nums)), nums.index(max(nums))
- root.left = self.constructMaximumBinaryTree(nums[:maxi])
- root.right = self.constructMaximumBinaryTree(nums[maxi + 1:])
- return root
Python:
- # Time: O(n)
- # Space: O(n)
- class TreeNode(object):
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
- class Solution(object):
- def constructMaximumBinaryTree(self, nums):
- """
- :type nums: List[int]
- :rtype: TreeNode
- """
- nodeStack = []
- for num in nums:
- node = TreeNode(num);
- while nodeStack and num > nodeStack[-1].val:
- node.left = nodeStack.pop()
- if nodeStack:
- nodeStack[-1].right = node
- nodeStack.append(node)
- return nodeStack[0]
Python:
- class Solution(object):
- def constructMaximumBinaryTree(self, nums):
- """
- :type nums: List[int]
- :rtype: TreeNode
- """
- if not nums:
- return
- mx = float('-inf')
- mx_index = 0
- for i in range(len(nums)):
- if nums[i] > mx:
- mx = nums[i]
- mx_index = i
- root = TreeNode(mx)
- if mx_index > 0:
- root.left = self.constructMaximumBinaryTree(nums[:mx_index])
- if mx_index < len(nums) - 1:
- root.right = self.constructMaximumBinaryTree(nums[mx_index+1:])
- return root
C++:
- class Solution {
- public:
- TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
- if (nums.empty()) return NULL;
- int mx = INT_MIN, mx_idx = 0;
- for (int i = 0; i < nums.size(); ++i) {
- if (mx < nums[i]) {
- mx = nums[i];
- mx_idx = i;
- }
- }
- TreeNode *node = new TreeNode(mx);
- vector<int> leftArr = vector<int>(nums.begin(), nums.begin() + mx_idx);
- vector<int> rightArr = vector<int>(nums.begin() + mx_idx + 1, nums.end());
- node->left = constructMaximumBinaryTree(leftArr);
- node->right = constructMaximumBinaryTree(rightArr);
- return node;
- }
- };
C++:
- class Solution {
- public:
- TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
- if (nums.empty()) return NULL;
- return helper(nums, 0, nums.size() - 1);
- }
- TreeNode* helper(vector<int>& nums, int left, int right) {
- if (left > right) return NULL;
- int mid = left;
- for (int i = left + 1; i <= right; ++i) {
- if (nums[i] > nums[mid]) {
- mid = i;
- }
- }
- TreeNode *node = new TreeNode(nums[mid]);
- node->left = helper(nums, left, mid - 1);
- node->right = helper(nums, mid + 1, right);
- return node;
- }
- };
C++:
- class Solution {
- public:
- TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
- vector<TreeNode*> v;
- for (int num : nums) {
- TreeNode *cur = new TreeNode(num);
- while (!v.empty() && v.back()->val < num) {
- cur->left = v.back();
- v.pop_back();
- }
- if (!v.empty()) {
- v.back()->right = cur;
- }
- v.push_back(cur);
- }
- return v.front();
- }
- };
All LeetCode Questions List 题目汇总
[LeetCode] 654. Maximum Binary Tree 最大二叉树的更多相关文章
- LeetCode 654. Maximum Binary Tree最大二叉树 (C++)
题目: Given an integer array with no duplicates. A maximum tree building on this array is defined as f ...
- LeetCode - 654. Maximum Binary Tree
Given an integer array with no duplicates. A maximum tree building on this array is defined as follo ...
- 654. Maximum Binary Tree最大二叉树
网址:https://leetcode.com/problems/maximum-binary-tree/ 参考: https://leetcode.com/problems/maximum-bina ...
- [LeetCode]654. Maximum Binary Tree最大堆二叉树
每次找到数组中的最大值,然后递归的构建左右树 public TreeNode constructMaximumBinaryTree(int[] nums) { if (nums.length==0) ...
- 654. Maximum Binary Tree
654. Maximum Binary Tree 题目大意: 意思就是给你一组数,先选一个最大的作为根,这个数左边的数组作为左子树,右边的数组作为右子树,重复上一步. 读完就知道是递归了. 这个题真尼 ...
- [Leetcode Week14]Maximum Binary Tree
Maximum Binary Tree 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/maximum-binary-tree/description/ ...
- 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- 【leetcode】654. Maximum Binary Tree
题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...
- [LeetCode] 655. Print Binary Tree 打印二叉树
Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...
随机推荐
- springboot禁用内置Tomcat的不安全请求方法
起因:安全组针对接口测试提出的要求,需要关闭不安全的请求方法,例如put.delete等方法,防止服务端资源被恶意篡改. 用过springMvc都知道可以使用@PostMapping.@GetMapp ...
- Codeforces D. Intercity Travelling(区间组合)
题目描述: D. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- KClass与函数引用详解
继续学习Kotlin反射相关的东东. KClass: 在上一次是通过类来获取它的KClass对象: 那如果是一个对象呢?与这个对象对应的类的KClass对象又是如何获取的呢?像Java也是一样有相关机 ...
- Zookeeper基础入门介绍
什么Zookeeper Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命 ...
- 时间戳显示为多少分钟前,多少天前的JS处理,JS时间格式化,时间戳的转换
var dateDiff = function (timestamp) { // 补全为13位 var arrTimestamp = (timestamp + '').split(''); for ( ...
- Build Post Office
Description Given a 2D grid, each cell is either an house 1 or empty 0 (the number zero, one), find ...
- [NPM + React] Prepare a Custom React Hook to be Published as an npm Package
Before we publish our package, we want to make sure everything is set up correctly. We’ll cover vers ...
- Bootstrap Method
bootstrap方法是一种重采样技术,用于通过抽样数据集来估计总体统计数据.是一种面向应用的.基于大量计算的统计思维——模拟抽样统计推断. 它可以用来估计统计数据,例如平均值或标准差.在应用机器学习 ...
- LeetCode 742. Closest Leaf in a Binary Tree
原题链接在这里:https://leetcode.com/problems/closest-leaf-in-a-binary-tree/ 题目: Given a binary tree where e ...
- 是Mscoreei.dll的正确版本吗?
在安装.NET 4.0或更高版本之后,您可能会注意到.NET进程有点不寻常.下面是用.NET 2.0编译器编译的简单“Hello World”可执行文件的加载模块的部分列表. 开始-结束模块名称 60 ...