如何获取二叉树中的最大路径开销, 并打印一个向量包括所有路径数据元素?
我知道如何获得成本,但不知道如何获得元素矢量 有什么帮助吗?
struct Node
{
int data;
Node* left;
Node* right;
};
int treeMaxPath(Node* root) {
if (root== NULL)
return 0;
else
return root->data + max(treeMaxPath(root->left), treeMaxPath(root->right));
}
答案 0 :(得分:2)
data += max subtrees
。(data - max subtrees)
的值,然后打印最大的孩子。data -= max subtrees
。注意:
这是O(N)时间复杂度和O(1)的内存。
可以通过向Node
添加新变量来更改为存储最大值而不修改数据。
可以轻松修改它以打印树中的所有最大路径。
int maxChild(const Node *root) {
return max(root->left ? root->left.data : 0,
root->right ? root->right.data : 0);
}
void treeBottomUp(Node* root) {
if (root) {
treeBottomUp(root->left);
treeBottomUp(root->right);
root->data += maxChild(root);
}
}
void treeRestore(Node *root) {
if (root) {
root->data -= maxChild(root);
treeRestore(root->left);
treeRestore(root->right);
}
}
void printMaxPath(const Node* root) {
if (root) {
printf("%d\n", root->data - maxChild(root));
if (root->left && root->left.data >= maxChild(root)) {
printMaxPath(root->left);
} else {
printMaxPath(root->right);
}
}
}
并且要做到这一切:
void solveTree(Node *root) {
treeBottomUp(root);
printMaxPath(root);
treeRestore(root);
}
答案 1 :(得分:0)
返回pair
的费用和路径。路径可以存储在vector<Node*>
。
答案 2 :(得分:0)
完成对整个树的treeMaxPath
调用后(如果在根上调用整个树,则完成递归调用),您将使用深度值更新整个树。
现在,您可以轻松地使用一个简单的循环进行小型跟踪,以便沿着最高深度值从树根遍历,直到满足NULL子项。
p.s。我不确定您的treeMaxPath
实施是否正确。如果您存储在某个节点的数据是深度,则应更改算法的某些部分。