📌  相关文章
📜  在 n 叉树中具有最大直接子节点和自身的节点(1)

📅  最后修改于: 2023-12-03 15:07:44.686000             🧑  作者: Mango

在 n 叉树中具有最大直接子节点和自身的节点

在一个 n 叉树中,找到具有最大直接子节点和自身节点权值和的节点。

思路

可以采用递归的方式,先计算出每个节点的直接子节点和自身的权值和,再递归计算它的每个子节点。最后比较每个节点的权值和,找到最大值即可。

代码实现
/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     int numChildren;
 *     struct Node** children;
 * };
 */

int maxSum;
struct Node* maxNode;

int getSum(struct Node* node) {
    if (node == NULL) return 0;

    int sum = node->val;
    for (int i = 0; i < node->numChildren; i++) {
        sum += getSum(node->children[i]);
    }

    if (sum > maxSum) {
        maxSum = sum;
        maxNode = node;
    }

    return sum;
}

struct Node* maxSumNode(struct Node* root) {
    maxSum = 0;
    maxNode = NULL;
    getSum(root);
    return maxNode;
}
时间复杂度

时间复杂度为 O(n),其中 n 为节点数。每个节点只会遍历一遍,所以时间复杂度是线性的。

空间复杂度

空间复杂度为 O(h),其中 h 为树的高度。递归的深度最多为树的高度,所以空间复杂度是与树高度相关的。