← All problems

623. Add One Row to Tree

MediumOpen on LeetCodeProblem statement

Problem Statement

623. Add One Row to Tree

Medium


Given the root of a binary tree and two integers val and depth, add a row of nodes with value val at the given depth depth.

Note that the root node is at depth 1.

The adding rule is:

 

Example 1:

Input: root = [4,2,6,3,1,5], val = 1, depth = 2
Output: [4,1,1,2,null,null,6,3,1,5]

Example 2:

Input: root = [4,2,null,3,1], val = 1, depth = 3
Output: [4,2,null,1,1,3,null,null,1]

 

Constraints:

C++

Source file
/**
 * 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* addOneRow(TreeNode* root, int val, int depth) {
        if(depth==1){    // base case (root case)
            TreeNode* oldRoot = root;
            root= new TreeNode(val, oldRoot, nullptr);
        }
        queue<TreeNode*> q;
        q.push(root);
        TreeNode* cur;
        int d=1, ct=1;  // depth & count of nodes in each level
        while(!q.empty()){
            if(d==depth-1){ // after parents of required depth found
                while(!q.empty()){  // Loop ==> can be made into a different fx altogether
                    cur = q.front();
                    if(cur){
                        TreeNode* lt=cur->left;
                        TreeNode* rt=cur->right;
                        cur->left= new TreeNode(val, lt, nullptr);
                        cur->right= new TreeNode(val, nullptr, rt);
                    }
                    q.pop();
                }
                return root;
            }
            // Usual loop until parents of reqd depth has not been reached
            cur = q.front();
            if(cur){
                q.push(cur->left);
                q.push(cur->right);
            }
            q.pop();
            if(!(--ct))
                ct=q.size(), d++;
        }
        return root;
    }
};