Diameter_TREE_GFG
unknown
c_cpp
4 years ago
3.4 kB
9
Indexable
// { Driver Code Starts #include <bits/stdc++.h> using namespace std; /* A binary tree node has data, pointer to left child and a pointer to right child */ struct Node { int data; struct Node* left; struct Node* right; }; Node* newNode(int val) { Node* temp = new Node; temp->data = val; temp->left = NULL; temp->right = NULL; return temp; } 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<string> 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<Node*> 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 /* Tree node structure used in the program struct Node { int data; struct Node* left; struct Node* right; Node(int x){ data = x; left = right = NULL; } }; */ class Solution { public: // Function to return the diameter of a Binary Tree. int depth(Node* root) { if(root == NULL) return 0; return 1+max( depth(root->left), depth(root->right)); } int diameter(Node* root) { // Your code here int ln=0, rn=0, ans=0; if(root->left == NULL and root->right == NULL) return 1; else if(root->left == NULL and root->right != NULL){ root = root->right; ln = depth(root->left); rn = depth(root->right); ans = ln+rn+1; ans = max(ln+rn+1, rn+2); } else if(root->left != NULL and root->right == NULL){ root = root->left; ln = depth(root->left); rn = depth(root->right); ans = ln+rn+1; ans = max(ln+rn+1, ln+2); } else{ ln = depth(root->left); rn = depth(root->right); ans = ln+rn+1; } // cout<<ln<<" "<<rn<<" "; return ans; } }; // { Driver Code Starts. /* Driver program to test size function*/ int main() { int t; scanf("%d\n", &t); while (t--) { string s; getline(cin, s); Node* root = buildTree(s); Solution ob; cout << ob.diameter(root) << endl; } return 0; } // } Driver Code Ends
Editor is loading...