Diameter_TREE_GFG

 avatar
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...