美文网首页
最小/大子树

最小/大子树

作者: Magic11 | 来源:发表于2019-01-10 09:33 被阅读0次

一、描述
给一棵二叉树, 找到和为最小的子树, 返回其根节点。
LintCode会打印根节点为你返回节点的子树。保证只有一棵和最小的子树并且给出的二叉树不是一棵空树。
您在真实的面试中是否遇到过这个题? 是
题目纠错
样例
给一棵二叉树:

 1

/
-5 2
/ \ /
0 2 -4 -5
返回节点 1
题目链接:https://www.lintcode.com/problem/minimum-subtree/
1、通过全局变量来实现

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: the root of binary tree
     * @return: the root of the minimum subtree
     */
    TreeNode * findSubtree(TreeNode * root) {
        // write your code here
        if (root == NULL) {
            return NULL;
        }
        
        sumTree(root);
        
        return m_subRoot;
    }
    
    int sumTree(TreeNode * root) {
        if (root == NULL) {
            return 0;
        }
        
        int leftSum = sumTree(root->left);
        int rightSum = sumTree(root->right);
        
        int sum = leftSum + rightSum + root->val;
        
        if (sum <= m_subSum) {
            m_subSum = sum;
            m_subRoot = root;
        }
        return sum;
    }
    
private:
    TreeNode *m_subRoot = NULL;
    int m_subSum = INT_MAX; 
};

同理最大子树

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: the root of binary tree
     * @return: the maximum weight node
     */
    TreeNode * findSubtree(TreeNode * root) {
        // write your code here
        if (root == NULL) {
            return NULL;
        }
        
        sumTree(root);
        
        return m_subRoot;
    }
    
    int sumTree(TreeNode * root) {
        if (root == NULL) {
            return 0;
        }
        
        int leftSum = sumTree(root->left);
        int rightSum = sumTree(root->right);
        
        int sum = leftSum + rightSum + root->val;
        
        if (sum >= m_subSum) {
            m_subSum = sum;
            m_subRoot = root;
        }
        return sum;
    }
    
private:
    TreeNode *m_subRoot = NULL;
    int m_subSum = INT_MIN; 
};

二、具有最大平均数的子树
描述
给一棵二叉树,找到有最大平均值的子树。返回子树的根结点。
LintCode会打印出根结点为你返回节点的子树,保证有最大平均数子树只有一棵
您在真实的面试中是否遇到过这个题? 是
题目纠错
样例
给一个二叉树:

 1

/
-5 11
/ \ /
1 2 4 -2
返回节点 11。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
struct ResultType {
public:
     int sum;
     int size;
     ResultType() : sum(0), size(0) {}
     ResultType(int _sum, int _size) : sum(_sum), size(_size) {}
};

class Solution {
public:
    /**
     * @param root: the root of binary tree
     * @return: the root of the minimum subtree
     */
    TreeNode * findSubtree2(TreeNode * root) {
        // write your code here
        if (root == NULL) {
            return NULL;
        }
        
        sumTree(root);
        
        return m_subRoot;
    }
    
    ResultType sumTree(TreeNode * root) {
        ResultType result;
        if (root == NULL) {         
            return result;
        }

        ResultType resultLeft = sumTree(root->left);
        ResultType resultRight = sumTree(root->right);
        
        result.sum = resultLeft.sum + resultRight.sum + root->val;
        result.size = resultLeft.size + resultRight.size + 1;
        
        if (m_subRoot == NULL || result.sum * m_subResult.size >= m_subResult.sum * result.size) {
            m_subRoot = root;
            m_subResult = result;
        }
        return result;
    }
    
private:
    TreeNode *m_subRoot = NULL;
    ResultType m_subResult; 
};

以上还可以通过分治法实现,详细见链接:
https://www.jianshu.com/p/af2af240ac5f

相关文章

  • minimum-depth-of-binary-tree

    递归:若为空树返回0; 若左子树为空,则返回右子树的最小深度+1; 若右子树为空,则返回左子树的最小深度+1; 若...

  • 最小/大子树

    一、描述给一棵二叉树, 找到和为最小的子树, 返回其根节点。LintCode会打印根节点为你返回节点的子树。保证只...

  • 111. Minimum Depth of Binary Tre

    题目 给定一个二叉树,求二叉树最小深度 解析 一个二叉树的最小深度,就是求左子树最小深度或者右子树最小深度,然后加...

  • [LeetCode OJ]- Minimum Depth of

    题目要求:求一颗二叉树的最小深度 思路:递归+左右子树深度比较,当子树为空时,返回0

  • 5.AVL树和伸展树

    0.背景 二叉搜索树在删除操作会选区右子树的最小元素节点代替删除的节点,会使得左子树比右子树深度深,虽然可以通过随...

  • Graph-一般算法

    和图相关的算法有:最小生成子树,最短路径,拓扑排序。 这里仅介绍最小生成树和最短路径,拓扑排序暂时省略。 最小生成...

  • 力扣 865 具有所有最深节点的最小子树

    题意:给定一个树,返回具有最深节点的最小子树 思路:后跟遍历树 如果节点为null,返回null 获取左右子树的最...

  • 111. Minimum Depth of Binary Tre

    给一个二叉树,找到最小深度分几种情况, 如果树为空,则返回0 如果只存在左子树或者只存在右子树,则返回值应为左子树...

  • 5870. 每棵子树内缺失的最小基因值

    5870. 每棵子树内缺失的最小基因值[https://leetcode-cn.com/problems/smal...

  • 平衡二叉树

    平衡二叉树:是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。 基本概念 最小不平衡子树:距离插...

网友评论

      本文标题:最小/大子树

      本文链接:https://www.haomeiwen.com/subject/pujorqtx.html