问题
最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值。
给出最大树的根节点 。
就像之前的问题那样,给定的树是从表 递归地使用下述 例程构造的:
- 如果 为空,返回
- 否则,令 作为 的最大元素。创建一个值为 的根节点
- 的左子树将被构建为
- 的右子树将被构建为
- 返回 请注意,我们没有直接给定 ,只有一个根节点 .
假设 是 的副本,并附加值 。保证 中的值是不同的。
返回 。
示例 1:
graph TD A[4] --> B[1] A --> C[3] B --> D[ ] B --> E[ ] C --> F[2] C --> G[ ] style D fill:transparent,stroke:transparent style E fill:transparent,stroke:transparent style G fill:transparent,stroke:transparent
graph TD A[5] --> B[4] A --> C[ ] B --> D[1] B --> E[3] E --> F[2] E --> G[ ] style C fill:transparent,stroke:transparent style G fill:transparent,stroke:transparent
输入: 输出: 解释:
示例 2:
graph TD A[5] --> B[2] A --> C[4] B --> D[ ] B --> E[1] style D fill:transparent,stroke:transparent
graph TD A[5] --> B[2] A --> C[4] B --> D[ ] B --> E[1] C --> F[ ] C --> G[3] style D fill:transparent,stroke:transparent style F fill:transparent,stroke:transparent
输入: 输出: 解释:
示例 3:
graph TD A[5] --> B[2] A --> C[3] B --> D[ ] B --> E[1] style D fill:transparent,stroke:transparent
graph TD A[5] --> B[2] A --> C[4] B --> D[ ] B --> E[1] C --> F[3] C --> G[ ] style D fill:transparent,stroke:transparent style G fill:transparent,stroke:transparent
输入: 输出: 解释:
解法
这道题本身不难,难得是理解题意,一开始我还在想示例2中的3放在5前面似乎也并无不可。后来才发现,其实是追加在末尾的,而不是随便放在哪个位置的。既然这样,考虑一下与的大小关系,一共有三种情况:
- 为空,此时直接生成一个TreeNode(val)返回即可
- ,此时说明,已经找到了应该在的位置,那么生成一个TreeNode(val), 并且将左儿子设置成(因为对应的数组元素必然在的左边。)
- ,此时说明,仍然没有找到所在位置,但是因为在最右,那么递归到中去处理。
递归完成后返回root即可。
代码
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode insertIntoMaxTree(TreeNode root, int val) {
// 情况1
if (root == null) {
return new TreeNode(val);
}
// 情况2
if (root.val < val) {
TreeNode node = new TreeNode(val);
node.left = root;
return node;
}
// 情况3
root.right = insertIntoMaxTree(root.right,val);
//最终递归返回
return root;
}
}