Welcome to Subscribe On Youtube

1028. Recover a Tree From Preorder Traversal

Description

We run a preorder depth-first search (DFS) on the root of a binary tree.

At each node in this traversal, we output D dashes (where D is the depth of this node), then we output the value of this node.  If the depth of a node is D, the depth of its immediate child is D + 1.  The depth of the root node is 0.

If a node has only one child, that child is guaranteed to be the left child.

Given the output traversal of this traversal, recover the tree and return its root.

 

Example 1:

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

Example 2:

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

Example 3:

Input: traversal = "1-401--349---90--88"
Output: [1,401,null,349,88,90]

 

Constraints:

  • The number of nodes in the original tree is in the range [1, 1000].
  • 1 <= Node.val <= 109

Solutions

  • /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* recoverFromPreorder(string S) {
            stack<TreeNode*> st;
            int depth = 0;
            int num = 0;
            for (int i = 0; i < S.length(); ++i) {
                if (S[i] == '-') {
                    depth++;
                } else {
                    num = 10 * num + S[i] - '0';
                }
                if (i + 1 >= S.length() || (isdigit(S[i]) && S[i + 1] == '-')) {
                    TreeNode* newNode = new TreeNode(num);
                    while (st.size() > depth) {
                        st.pop();
                    }
                    if (!st.empty()) {
                        if (st.top()->left == nullptr) {
                            st.top()->left = newNode;
                        } else {
                            st.top()->right = newNode;
                        }
                    }
                    st.push(newNode);
                    depth = 0;
                    num = 0;
                }
            }
            TreeNode* res;
            while (!st.empty()) {
                res = st.top();
                st.pop();
            }
            return res;
        }
    };
    
  • /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public TreeNode recoverFromPreorder(String traversal) {
            Stack<TreeNode> stack = new Stack<>();
            int i = 0;
    
            while (i < traversal.length()) {
                int depth = 0;
                while (i < traversal.length() && traversal.charAt(i) == '-') {
                    depth++;
                    i++;
                }
    
                int num = 0;
                while (i < traversal.length() && Character.isDigit(traversal.charAt(i))) {
                    num = num * 10 + (traversal.charAt(i) - '0');
                    i++;
                }
    
                // Create the new node
                TreeNode newNode = new TreeNode(num);
    
                while (stack.size() > depth) {
                    stack.pop();
                }
                if (!stack.isEmpty()) {
                    if (stack.peek().left == null) {
                        stack.peek().left = newNode;
                    } else {
                        stack.peek().right = newNode;
                    }
                }
    
                stack.push(newNode);
            }
            return stack.isEmpty() ? null : stack.get(0);
        }
    }
    
    
  • function recoverFromPreorder(traversal: string): TreeNode | null {
        const stack: TreeNode[] = [];
        let i = 0;
    
        while (i < traversal.length) {
            let depth = 0;
            while (i < traversal.length && traversal[i] === '-') {
                depth++;
                i++;
            }
    
            let num = 0;
            while (i < traversal.length && !Number.isNaN(+traversal[i])) {
                num = num * 10 + +traversal[i];
                i++;
            }
    
            // Create the new node
            const newNode = new TreeNode(num);
    
            while (stack.length > depth) {
                stack.pop();
            }
    
            if (stack.length > 0) {
                const i = stack.length - 1;
                if (stack[i].left === null) {
                    stack[i].left = newNode;
                } else {
                    stack[i].right = newNode;
                }
            }
    
            stack.push(newNode);
        }
    
        return stack.length ? stack[0] : null;
    }
    
    
  • function recoverFromPreorder(traversal) {
        const stack = [];
        let i = 0;
    
        while (i < traversal.length) {
            let depth = 0;
            while (i < traversal.length && traversal[i] === '-') {
                depth++;
                i++;
            }
    
            let num = 0;
            while (i < traversal.length && !Number.isNaN(+traversal[i])) {
                num = num * 10 + +traversal[i];
                i++;
            }
    
            // Create the new node
            const newNode = new TreeNode(num);
    
            while (stack.length > depth) {
                stack.pop();
            }
    
            if (stack.length > 0) {
                const i = stack.length - 1;
                if (stack[i].left === null) {
                    stack[i].left = newNode;
                } else {
                    stack[i].right = newNode;
                }
            }
    
            stack.push(newNode);
        }
    
        return stack.length ? stack[0] : null;
    }
    
    

All Problems

All Solutions