问题描述:
- 给定最大树的根节点
root 和一个整数 val 。
- 最大树定义为:满足其中每个节点的值都大于其子树中的任何其他值的一棵树。
- 该题的前导题为 leetcode 654 最大二叉树。【做 998 前最好做一遍 654】
- 该题 998 中给定的
root 正是由 654 中的数组构造而成。
- 而该题的问题就是,假设
root 由数组 a 构成,在数组 a 的末尾加上一个数 val 构成数组 b ,返回由数组 b 构成的最大树。
核心思路:
- 该题题意其实并不难理解(虽然写了一大堆有的没的定义),但是需要先做了 leetcode 654,有了 654 的基础,该题的解题就比较容易想。
- 654 其实就是用一个数组
a 构建了最大树 root ;998 其实就是问给定 root ,往 root 代表的数组 a 末尾插入一个值 val 组成新的数组 b ,返回 b 构建的最大树。 - 自然是不需要重新构建数组
b 来重新构建最大树,只需要遍历最大树找到相应的插入位置即可,更进一步来说,只需要从根节点开始一直往右遍历就可以找到插入位置。
- 这个解题思路是很自然的事,因为插入值
val 处于数组 b 的末尾,那它插入后只可能是根节点开始一直往右遍历过程中某个节点的父节点。所以只需要一直访问右子节点,直到找到值低于 val 的第一个节点。【找到该节点后,在该节点与其父节点之间插入值即可】 - 该题可以用迭代和递归的方法来解题。
代码实现:
- 迭代解法代码实现如下:
class Solution
{
public:
TreeNode* insertIntoMaxTree(TreeNode* root, int val)
{
TreeNode* node = new TreeNode(val);
TreeNode* cur = root;
TreeNode* pre = nullptr;
while(cur)
{
if(cur->val < val)
{
if(pre) pre->right = node;
else root = node;
node->left = cur;
break;
}
pre = cur;
cur = cur->right;
}
if(!cur)
pre->right = node;
return root;
}
};
- 递归解法代码实现如下:【贴自评论区,其实思路是一样的,不断访问右子节点】
class Solution {
public:
TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
if (!root || root->val < val)
return new TreeNode(val, root, nullptr);
root->right = insertIntoMaxTree(root->right, val);
return root;
}
};
|