zl程序教程

您现在的位置是:首页 >  其他

当前栏目

LeetCode·每日一题·998,最大二叉树 || ·递归

LeetCode二叉树递归 最大 每日
2023-09-27 14:26:29 时间

链接:https://leetcode.cn/problems/maximum-binary-tree-ii/solution/-by-xun-ge-v-r5uq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

示例

 

思路

解题思路
关于树的相关问题使用递归基本上都可以解决

本题并不难,感觉难点在于读懂题目。

题目给定的根节点是由一个数组a根据最大树规则构造的一个最大树,在数组a后面加一个元素返回重新构造之后的最大树
【暴力解法】
那就简单了,暴力解法就是先使用中序遍历将根节点转化为数组a,再在数组a后面添加一个元素转化为数组b,然后再将数组b转化为最大树,转化规则题目都给定了,直接使用递归按题目给定要求构造即可

【利用最大树性质】
很显然暴力解法时间消耗大,而且繁琐。那么有没有简单一些的方法呢,当然有。
我们可以利用最大树规则性质,可以发现在数组a后面添加一个元素数组b

  • 如果这个元素val比数组a最大值(其实就是根节点)大,那么val左边的元素(其实就是当前根节点的子孙节点)都是val的左节点
  • 如果这个元素val比数组a最大值(其实就是根节点)小,那么val肯定是当前根节点的右节点
  • 利用上面性质递归即可,需要细细品味

代码注释超级详细

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


struct TreeNode* insertIntoMaxTree(struct TreeNode* root, int val){
    //如果这个元素val比数组a最大值(其实就是根节点)大
    //那么val左边的元素(其实就是当前根节点的子孙节点)都是val的左节点

    //当前节点不存在,那肯定就比val小
    if(!root || root->val < val)
    {
        struct TreeNode* node = (struct TreeNode* )calloc(1, sizeof(struct TreeNode));
        node->val = val;
        node->left = root;
        return node;
    }
    //如果这个元素val比数组a最大值(其实就是根节点)小
    //那么val肯定是当前根节点的右节点
    root->right = insertIntoMaxTree(root->right, val);
    return root;
}

作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-binary-tree-ii/solution/-by-xun-ge-v-r5uq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。