Keshawn_lu's Blog

Leetcode 998. 最大二叉树 II

字数统计: 581阅读时长: 2 min
2022/08/30 Share

题目简介:

最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。

给你最大树的根节点 root 和一个整数 val

就像 之前的问题 那样,给定的树是利用 Construct(a) 例程从列表 aroot = 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)

假设 ba 的副本,并在末尾附加值 val。题目数据保证 b 中的值互不相同。

返回 Construct(b)

示例 1:

maximum-binary-tree-1-1

maximum-binary-tree-1-2

1
2
3
输入:root = [4,1,3,null,null,2], val = 5
输出:[5,4,null,1,3,null,null,2]
解释:a = [1,4,2,3], b = [1,4,2,3,5]

提示:

  • 树中节点数目在范围 [1, 100]
  • 1 <= Node.val <= 100
  • 树中的所有值 互不相同
  • 1 <= val <= 100

思路:

val是数组中最大的值时,直接将其作为根节点,并将原来的根节点作为其左子树即可(val添加在末端)。

否则,由于val在末端,所以我们需要遍历根节点的右节点

  • val大于某个右节点的值,则将val作为该右节点父节点的新右节点,并将原右节点作为其左节点。
  • 若没有大于任何一个右节点,则将其作为最后一个右节点的右节点即可。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* 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){

TreeNode* res = new TreeNode(val);

res -> left = root;

return res;
}

TreeNode* node = root -> right;
TreeNode* parent = root;
while(node){

if(val > node -> val){

TreeNode* val_node = new TreeNode(val);
parent -> right = val_node;

val_node -> left = node;

return root;
}
else{

parent = node;
node = node -> right;
}
}

TreeNode* val_node = new TreeNode(val); //是右节点里最小的值

parent -> right = val_node;

return root;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: