问题

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

给出最大树的根节点

就像之前的问题那样,给定的树是从表 递归地使用下述  例程构造的:

  • 如果  为空,返回 
  • 否则,令  作为 的最大元素。创建一个值为  的根节点
  •  的左子树将被构建为 
  •  的右子树将被构建为
  • 返回  请注意,我们没有直接给定 ,只有一个根节点 .

假设 的副本,并附加值 。保证  中的值是不同的。

返回 

示例 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前面似乎也并无不可。后来才发现,其实是追加在末尾的,而不是随便放在哪个位置的。既然这样,考虑一下的大小关系,一共有三种情况:

  1. 为空,此时直接生成一个TreeNode(val)返回即可
  2. ,此时说明,已经找到了应该在的位置,那么生成一个TreeNode(val), 并且将左儿子设置成(因为对应的数组元素必然在的左边。)
  3. ,此时说明,仍然没有找到所在位置,但是因为在最右,那么递归到中去处理。

递归完成后返回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;
    }
}