Binary Trees HT #3

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int data;
    struct TreeNode* left;
    struct TreeNode* right;

    TreeNode(int val){
        data = val;
        left = right = NULL;
    }
};

TreeNode* makeTree(vector<intarrint i){
    if(i >= arr.size()) return NULL;

    TreeNode* root = new TreeNode(arr[i]);

    root->left = makeTree(arr2*i+1);
    root->right = makeTree(arr2*i+2);

    return root;
}

void printTree_PRE(TreeNode* root){
    if(root == NULLreturn;

    // preorder: root, left, right
    cout << root->data << " ";
    printTree_PRE(root->left);
    printTree_PRE(root->right);
}
void printTree_IN(TreeNode* root){
    if(root == NULLreturn;

    // preorder:  left, root, right
    printTree_IN(root->left);
    cout << root->data << " ";
    printTree_IN(root->right);
}
void printTree_POST(TreeNode* root){
    if(root == NULLreturn;

    // preorder: left, right, root
    printTree_POST(root->left);
    printTree_POST(root->right);
    cout << root->data << " ";
}


// void levelOrder(TreeNode* root, queue<TreeNode*> &q){
//     if(root == NULL || q.empty()) return;

//     cout << q.front()->data << " ";
//     TreeNode* node = q.front();
//     q.pop();

//     q.push(node->left);
//     q.push(node->right);

//     if(q.front()) levelOrder(node, q);
// }

void subBfs(vector<int&ansqueue<TreeNode*&q){
    if(q.empty()) return;

    TreeNode* temp = q.front();
    q.pop();
    ans.push_back(temp->data);

    if(temp->left) q.push(temp->left);
    if(temp->right) q.push(temp->right);

    subBfs(ansq);
    return;
}

vector<intlevelOrder(TreeNode* root){
    vector<int> ans;
    if(root==NULLreturn ans;

    queue<TreeNode*> q;
    q.push(root);

    subBfs(ans, q);

    return ans;
}

int treeHeight(TreeNode* root){
    if(root == NULLreturn 0;

    int left = treeHeight(root->left);
    int right = treeHeight(root->right);

    return max(left, right) + 1;
}

int treeDiameter(TreeNode* root){
    if(root== NULLreturn 0;
    // 1. height_left + height_right + 1(root)
    // 2. maxdiameter at left or right

    // calculate the tree height from both sides and then return height_left + height_right + 1
    int leftHeight = treeHeight(root->left); 
    int rightHeight = treeHeight(root->right);

    int leftDiameter = treeDiameter(root->left);
    int rightDiameter = treeDiameter(root->right);

    return max(leftHeight+rightHeight+1max(leftDiameter, rightDiameter)); 

    // TC: O(N*height)
}

pair<int,intheightDiameter(TreeNode* root){
    if(root==NULL){
        pair<int,int> p;
        p.first = p.second = 0;
        return p;
    }

    pair<int,int> leftAns = heightDiameter(root->left);    
    pair<int,int> rightAns = heightDiameter(root->right);    

    int lh = leftAns.first;
    int ld = leftAns.second;

    int rh = rightAns.first;
    int rd = rightAns.second;

    pair<int,int> p;

    p.first = 1 + max(lh, rh);
    p.second = max(lh+rh+1max(ld, rd));

    return p;
    // TC = O(N)
}

// shortest distance between root and a leaf:
// if anyone left or right is NULL then return !null only because shortest path != 0 until both right and left == NULL.

int minDepth(TreeNode* root) {
    if(!rootreturn 0;
    
    if(root->right == NULL && root->left != NULL){
        return minDepth(root->left) + 1;
    }
    else if(root->left == NULL && root->right != NULL){
        return minDepth(root->right) + 1;
    }
    else return min(minDepth(root->right), minDepth(root->left)) + 1;
}



int solve(TreeNode* root){
    if(!rootreturn 0;

    // pass: l + r + data
    // take: l + r
    int temp = root->val;
    int l = solve(root->left);
    int r = solve(root->right);
    root->val = l + r;
    return l + r + temp;
}

void toSumTree(TreeNode* root){
    solve(root);
}



int main(){
    // makeTree() use number of elements = 1 3 7 15 (2**h - 1)
    // driver code

    TreeNode* root = makeTree({1,2,34,5,6,7}, 0);
    //    1
    //  2    3
    // 4 5  6 7

    // printTree_PRE(root);

  

    return 0;
}

Comments

Popular Posts