#include <iostream>
#include<queue>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class BinaryTree {
public:
TreeNode* root;
BinaryTree(TreeNode* r) : root(r) {}
~BinaryTree() {
clear(root);
}
void printTree() {
if (!root) {
cout << "Tree is empty";
return;
}
printTree(root, 0);
}
void printTree(TreeNode* root, int level) {
if (root == nullptr) {
return;
}
printTree(root->right, level + 1);
for (int i = 0; i < level; i++) {
cout << " ";
}
cout << root->val << "\n";
printTree(root->left, level + 1);
}
int calcMaxSubTreeSum() {
if (root == NULL) return 0;
int ans = -10000;
MaxSubTree(root, ans);
return ans;
}
TreeNode* subroot;
// Recursive function to calculate the sum of nodes
int MaxSubTree(TreeNode* root, int& ans) {
if (root == NULL) return 0;
int currSum = root->val + MaxSubTree(root->left, ans) + MaxSubTree(root->right, ans);
if (ans<currSum) subroot = root;
ans = max(ans, currSum);
return currSum;
}
void printMaxSubTree() {
if (!root) {
cout << "Tree is empty";
return;
}
printTree(subroot, 0);
}
void insert(int val) {
if (!root) {
root = new TreeNode(val);
return;
}
TreeNode* current = root;
TreeNode* parent = nullptr;
while (current) {
parent = current;
if (val < current->val)
current = current->left;
else
current = current->right;
}
if (val < parent->val)
parent->left = new TreeNode(val);
else
parent->right = new TreeNode(val);
}
private:
void clear(TreeNode* node) {
if (node) {
clear(node->left);
clear(node->right);
delete node;
}
}
};
int main() {
BinaryTree tree(nullptr);
tree.insert(-15);
tree.insert(-18);
tree.insert(-10);
tree.insert(-20);
tree.insert(-16);
tree.insert(-21);
tree.insert(-19);
tree.insert(-17);
tree.insert(-12);
tree.insert(-5);
tree.insert(-7);
tree.insert(2);
tree.insert(0);
tree.insert(7);
tree.insert(-2);
tree.insert(1);
tree.insert(4);
tree.insert(8);
tree.printTree();
cout << "Maximum sum subtree has sum of elemnets: " << tree.calcMaxSubTreeSum() << endl;
tree.printMaxSubTree();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxxdWV1ZT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBUcmVlTm9kZSB7CnB1YmxpYzoKICAgIGludCB2YWw7CiAgICBUcmVlTm9kZSAqbGVmdDsKICAgIFRyZWVOb2RlICpyaWdodDsKICAgIFRyZWVOb2RlKGludCB4KSA6IHZhbCh4KSwgbGVmdChudWxscHRyKSwgcmlnaHQobnVsbHB0cikge30KfTsKCmNsYXNzIEJpbmFyeVRyZWUgewpwdWJsaWM6CgogICAgVHJlZU5vZGUqIHJvb3Q7CiAgICBCaW5hcnlUcmVlKFRyZWVOb2RlKiByKSA6IHJvb3Qocikge30KCiAgICB+QmluYXJ5VHJlZSgpIHsKICAgICAgICBjbGVhcihyb290KTsKICAgIH0KCiAgICB2b2lkIHByaW50VHJlZSgpIHsKICAgICAgICBpZiAoIXJvb3QpIHsKICAgICAgICAgICAgY291dCA8PCAiVHJlZSBpcyBlbXB0eSI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHByaW50VHJlZShyb290LCAwKTsKICAgIH0KICAgIHZvaWQgcHJpbnRUcmVlKFRyZWVOb2RlKiByb290LCBpbnQgbGV2ZWwpIHsKICAgICAgICBpZiAocm9vdCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHByaW50VHJlZShyb290LT5yaWdodCwgbGV2ZWwgKyAxKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIiAgICAiOwogICAgICAgIH0KCiAgICAgICAgY291dCA8PCByb290LT52YWwgPDwgIlxuIjsKCiAgICAgICAgcHJpbnRUcmVlKHJvb3QtPmxlZnQsIGxldmVsICsgMSk7CiAgICB9CgogICAgaW50IGNhbGNNYXhTdWJUcmVlU3VtKCkgewogICAgaWYgKHJvb3QgPT0gTlVMTCkgcmV0dXJuIDA7CiAgICBpbnQgYW5zID0gLTEwMDAwOwogICAgTWF4U3ViVHJlZShyb290LCBhbnMpOwogICAgcmV0dXJuIGFuczsKICAgIH0KICAgIFRyZWVOb2RlKiBzdWJyb290OwogICAgLy8gUmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgc3VtIG9mIG5vZGVzCiAgICBpbnQgTWF4U3ViVHJlZShUcmVlTm9kZSogcm9vdCwgaW50JiBhbnMpIHsKICAgIGlmIChyb290ID09IE5VTEwpIHJldHVybiAwOwogICAgaW50IGN1cnJTdW0gPSByb290LT52YWwgKyBNYXhTdWJUcmVlKHJvb3QtPmxlZnQsIGFucykgKyBNYXhTdWJUcmVlKHJvb3QtPnJpZ2h0LCBhbnMpOwogICAgaWYgKGFuczxjdXJyU3VtKSBzdWJyb290ID0gcm9vdDsKICAgIGFucyA9IG1heChhbnMsIGN1cnJTdW0pOwogICAgcmV0dXJuIGN1cnJTdW07CiAgICB9CgogICAgdm9pZCBwcmludE1heFN1YlRyZWUoKSB7CiAgICAgICAgaWYgKCFyb290KSB7CiAgICAgICAgICAgIGNvdXQgPDwgIlRyZWUgaXMgZW1wdHkiOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwcmludFRyZWUoc3Vicm9vdCwgMCk7CiAgICB9CgogICAgdm9pZCBpbnNlcnQoaW50IHZhbCkgewogICAgICAgIGlmICghcm9vdCkgewogICAgICAgICAgICByb290ID0gbmV3IFRyZWVOb2RlKHZhbCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgVHJlZU5vZGUqIGN1cnJlbnQgPSByb290OwogICAgICAgIFRyZWVOb2RlKiBwYXJlbnQgPSBudWxscHRyOwogICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgIHBhcmVudCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIGlmICh2YWwgPCBjdXJyZW50LT52YWwpCiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bGVmdDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnJpZ2h0OwogICAgICAgIH0KICAgICAgICBpZiAodmFsIDwgcGFyZW50LT52YWwpCiAgICAgICAgICAgIHBhcmVudC0+bGVmdCA9IG5ldyBUcmVlTm9kZSh2YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcGFyZW50LT5yaWdodCA9IG5ldyBUcmVlTm9kZSh2YWwpOwogICAgfQoKcHJpdmF0ZToKICAgIHZvaWQgY2xlYXIoVHJlZU5vZGUqIG5vZGUpIHsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICBjbGVhcihub2RlLT5sZWZ0KTsKICAgICAgICAgICAgY2xlYXIobm9kZS0+cmlnaHQpOwogICAgICAgICAgICBkZWxldGUgbm9kZTsKICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIEJpbmFyeVRyZWUgdHJlZShudWxscHRyKTsKICAgIHRyZWUuaW5zZXJ0KC0xNSk7CiAgICB0cmVlLmluc2VydCgtMTgpOwogICAgdHJlZS5pbnNlcnQoLTEwKTsKICAgIHRyZWUuaW5zZXJ0KC0yMCk7CiAgICB0cmVlLmluc2VydCgtMTYpOwogICAgdHJlZS5pbnNlcnQoLTIxKTsKICAgIHRyZWUuaW5zZXJ0KC0xOSk7CiAgICB0cmVlLmluc2VydCgtMTcpOwogICAgdHJlZS5pbnNlcnQoLTEyKTsKICAgIHRyZWUuaW5zZXJ0KC01KTsKICAgIHRyZWUuaW5zZXJ0KC03KTsKICAgIHRyZWUuaW5zZXJ0KDIpOwogICAgdHJlZS5pbnNlcnQoMCk7CiAgICB0cmVlLmluc2VydCg3KTsKICAgIHRyZWUuaW5zZXJ0KC0yKTsKICAgIHRyZWUuaW5zZXJ0KDEpOwogICAgdHJlZS5pbnNlcnQoNCk7CiAgICB0cmVlLmluc2VydCg4KTsKICAgIHRyZWUucHJpbnRUcmVlKCk7CgogICAgY291dCA8PCAiTWF4aW11bSBzdW0gc3VidHJlZSBoYXMgc3VtIG9mIGVsZW1uZXRzOiAiIDw8IHRyZWUuY2FsY01heFN1YlRyZWVTdW0oKSA8PCBlbmRsOwogICAgdHJlZS5wcmludE1heFN1YlRyZWUoKTsKCiAgICByZXR1cm4gMDsKfQ==