📅  最后修改于: 2023-12-03 15:07:44.686000             🧑  作者: Mango
在一个 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 为树的高度。递归的深度最多为树的高度,所以空间复杂度是与树高度相关的。