Skip to main content

LeetCode Problem: 1028. Recover a Tree From Preorder Traversal

Problem Statement:
Recover binary tree from its given preorder traversal string. The string is given in the format: Dashes followed by value. The number of dashes convey its depth and value refers to the node value.

Example 1:
Input:
string = "1-2--3--4-5--6--7";
Output:
[1,2,5,3,4,6,7]

Example 2:
Input:
string = "1-2--3---4-5--6---7";
Output:
[1,2,5,3,null, 6, null, 4, null, 7]

Example 3:
Input:
string = "1-401--349---90--88";
Output:
[1,401,null,349,88,90].

Approach to the solution:
  1. Calculate value and its depth
  2. Check if right child is present. If yes then move to right child then go to step 2 again until depth of the node is reached.
  3. Else move to left and then go to step 2 again until depth of the node is reached.
  4. Once the calculated depth is reached.
  5. If left child of the node is null, create a new node and assign left child of the node.
  6. Else create a new node and assign it to right child.
  7. Continue from step 1 again until end of the string is reached.
Solution in C++:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* recoverFromPreorder(string S) {
            int iter = 0;
            int depth = 0;
            int num   = 0;
        num   = GetNum(S, iter);
        TreeNode* root = new TreeNode(num);
        while(iter < S.length()){
            depth = GetDepth(S, iter);
            num   = GetNum(S, iter);
            InsertIntoTree(root, depth, num);
        }
        return root;
    }
private:

    void InsertIntoTree(TreeNode* node, int depth, int value){
        while(--depth > 0){
            if(node->right){
                node = node->right;
            } else if(node->left){
                node = node->left;
            }
        }
        TreeNode *temp = new TreeNode(value);
        if(node->left == nullptr){
            node->left = temp;
        } else {
            node->right = temp;
        }
    }
    int GetDepth(string S, int &iter){
            int count = 0;
        while(S[iter] == '-'){
            ++iter;
            ++count;
        }
        return count;
    }   
    int GetNum(string S, int &iter){
            int num = 0;
        while(S[iter] != '-' && iter < S.length()){
            num = num * 10 + (int)(S[iter] - 48);
            ++iter;
        }
        return num;
    }
};

Comments

Popular posts from this blog

Leet Code: Problem #710 Random Pick with Blacklist

Given a blacklist  B containing unique integers from [0, N) , write a function to return a uniform random integer from [0, N) which is NOT  in B . Optimize it such that it minimizes the call to system’s Math.random() . Note: 1 <= N <= 1000000000 0 <= B.length < min(100000, N) [0, N)  does NOT include N. See interval notation . Example 1: Input: ["Solution","pick","pick","pick"] [[1,[]],[],[],[]] Output: [null,0,0,0] Example 2: Input: ["Solution","pick","pick","pick"] [[2,[]],[],[],[]] Output: [null,1,1,1] Example 3: Input: ["Solution","pick","pick","pick"] [[3,[1]],[],[],[]] Output: [null,0,0,2] Example 4: Input: ["Solution","pick","pick","pick"] [[4,[2]],[],[],[]] Output: [null,1,3,1] Explanation of Input Syntax: The input is two lists: the subroutines called and their argume...

Creating Self Signed SSL Certificates for HTTPS Communication

Self Signed CA: Create Private Key for Self Signed CA openssl ecparam -genkey -name secp256r1 | openssl ec -out ca.key     Create CA Certificate for Self Signed CA openssl req -new -x509 -days 36500 -key ca.key -out ca.pem -subj "/C=IN/ST=Karnataka/L=Bengaluru/O=company name/OU=Prod Operations Department/CN=prodops .domain.com   Verify the content of CA certificate openssl x509 -in ca.pem -noout -text Client CERTIFICATE: CLIENT_ID="<Client-Product>" e.g. CLIENT_ID="ClientID" CLIENT_SERIAL="<Client-Release-Number>" e.g. CLIENT_SERIAL="6889" Create Private Key for Client openssl ecparam -genkey -name secp256r1 | openssl ec -out  ${CLIENT_ID}_${CLIENT_SERIAL}.key                   Generate the Certificate Signing Request CSR openssl req -new -key ${CLIENT_ID}_${CLIENT_SERIAL}.key -out ${CLIENT_ID}_${CLIENT_SERIAL}.csr -subj "/C=IN/ST=Karnataka/L=Bengalur...

Tree Data Structure related must solve programming questions: Part - 1

LeetCode Problem #687 Given a binary tree find the longest possible path with same node values. The length of the path is determined the number of edges between the node. Example 1: Input: 5 / \ 4 5 / \ \ 1 1 5 Output:  2   Example 2: Input: 1 / \ 4 5 / \ \ 4 4 5 Output:  2 Solution in C++: /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode *left;  *     TreeNode *right;  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  * };  */ class Solution ...