leetcode最大二叉树系列
654. 最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
- 通过给定的数组构建最大二叉树,并且输出这个树的根节点。
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
题解:
思路很简单,先找最大值,然后左边放左子树右边放右子树,至于为什么要写一篇博客,,因为我感觉我迭代写的比递归好,所以我想试试递归的写法
/**
* 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* construct(vector<int>&nums,int l,int r){
int maxnum=l;
if(l>r)
return nullptr;
for(int i=l+1;i<=r;++i){
if(nums[i]>nums[maxnum])
maxnum=i;
}
TreeNode* temp=new TreeNode(nums[maxnum]);
temp->left=construct(nums,l,maxnum-1);
temp->right=construct(nums,maxnum+1,r);
return temp;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* ans=construct(nums,0,nums.size()-1);
return ans;
}
};
998. 最大二叉树 II
最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值。
给出最大树的根节点 root。
就像之前的问题那样,给定的树是从表 A(root = Construct(A))递归地使用下述 Construct(A) 例程构造的:
- 如果 A 为空,返回 null
- 否则,令 A[i] 作为 A 的最大元素。创建一个值为 A[i] 的根节点 root
- root 的左子树将被构建为 Construct([A[0], A[1], …, A[i-1]])
- root 的右子树将被构建为 Construct([A[i+1], A[i+2], …, A[A.length - 1]])
- 返回 root
请注意,我们没有直接给定 A,只有一个根节点 root = Construct(A).
假设 B 是 A 的副本,并附加值 val。保证 B 中的值是不同的。
返回 Construct(B)。
题解:
这道题就是上道题的变形,在尾部插入一值,让你重新构造这棵树,我这里想成搜索树了,想了半天。容易踩坑
(ps:递归的代码是真的简单啊…)
/**
* 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* insertIntoMaxTree(TreeNode* root, int val) {
if(val>=root->val){
root=new TreeNode(val,root,nullptr);
}
else {
if(root->right==nullptr)
root->right=new TreeNode(val);
else
root->right=insertIntoMaxTree(root->right,val);
}
return root;
}
};