diff --git a/C++/maxSumNonAdjacentNodes.cpp b/C++/maxSumNonAdjacentNodes.cpp new file mode 100644 index 0000000..f411127 --- /dev/null +++ b/C++/maxSumNonAdjacentNodes.cpp @@ -0,0 +1,149 @@ +// { Driver Code Starts +//Initial Template for C++ + +#include +using namespace std; + +// Tree Node +struct Node +{ + int data; + Node* left; + Node* right; +}; + +// Utility function to create a new Tree Node +Node* newNode(int val) +{ + Node* temp = new Node; + temp->data = val; + temp->left = NULL; + temp->right = NULL; + + return temp; +} + +// Function to Build Tree +Node* buildTree(string str) +{ + // Corner Case + if(str.length() == 0 || str[0] == 'N') + return NULL; + + // Creating vector of strings from input + // string after spliting by space + vector ip; + + istringstream iss(str); + for(string str; iss >> str; ) + ip.push_back(str); + + // Create the root of the tree + Node* root = newNode(stoi(ip[0])); + + // Push the root to the queue + queue queue; + queue.push(root); + + // Starting from the second element + int i = 1; + while(!queue.empty() && i < ip.size()) { + + // Get and remove the front of the queue + Node* currNode = queue.front(); + queue.pop(); + + // Get the current node's value from the string + string currVal = ip[i]; + + // If the left child is not null + if(currVal != "N") { + + // Create the left child for the current node + currNode->left = newNode(stoi(currVal)); + + // Push it to the queue + queue.push(currNode->left); + } + + // For the right child + i++; + if(i >= ip.size()) + break; + currVal = ip[i]; + + // If the right child is not null + if(currVal != "N") { + + // Create the right child for the current node + currNode->right = newNode(stoi(currVal)); + + // Push it to the queue + queue.push(currNode->right); + } + i++; + } + + return root; +} + + + // } Driver Code Ends +//User function Template for C++ + +//Node Structure +/* +struct Node +{ + int data; + Node* left; + Node* right; +}; +*/ + +class Solution{ + public: + //Function to return the maximum sum of non-adjacent nodes. + pair solve(Node* root) { + //base case + if(root == NULL) { + pair p = make_pair(0,0); + return p; + } + + pair left = solve(root->left); + pair right = solve(root->right); + + pair res; + + res.first = root->data + left.second + right.second; + + res.second = max(left.first, left.second) + max(right.first, right.second); + + return res; + + } + int getMaxSum(Node *root) + { + pair ans = solve(root); + return max(ans.first, ans.second); + } +}; + +// { Driver Code Starts. + +// Driver code +int main() +{ + int t; + scanf("%d ",&t); + while (t--) + { + string s; + getline(cin,s); + Node* root = buildTree(s); + Solution ob; + cout<