- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Recover a Tree From Preorder Traversal in C++
Suppose there is a binary tree. We will run a preorder depth first search on the root of a binary tree.
At each node in this traversal, the output will be D number of dashes (Here D is the depth of this node), after that we display the value of this node. As we know if the depth of a node is D, the depth of its immediate child is D+1 and the depth of the root node is 0.
Another thing we have to keep in mind that if a node has only one child, that child is guaranteed to be the left child. So, if the output S of this traversal is given, then recover the tree and return its root.
So, if the input is like "1-2--3--4-5--6--7", then the output will be
To solve this, we will follow these steps −
Define one stack st
i := 0, n := size of S
lvl := 0, num := 0
while i < n, do −
for initialize lvl := 0, when S[i] is same as '-', update (increase lvl by 1), (increase i by 1), do −
do nothing
num := 0
while (i < n and S[i] is not equal to '-'), do −
num := num * 10 + (S[i] - '0')
(increase i by 1)
while size of st > lvl, do −
delete element from st
temp = create a new Tree Node with num value
if not st is empty and not left of top element of st is null, then −
left of top element of st := temp
otherwise when not st is empty, then −
right of top element of st := temp
insert temp into st
while size of st > 1, do −
delete element from st
return (if st is empty, then NULL, otherwise top element of st)
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void inord(TreeNode *root){ if(root != NULL){ inord(root->left); cout << root->val << " "; inord(root->right); } } class Solution { public: TreeNode* recoverFromPreorder(string S) { stack<TreeNode*> st; int i = 0; int n = S.size(); int lvl = 0; int num = 0; while (i < n) { for (lvl = 0; S[i] == '-'; lvl++, i++) ; num = 0; while (i < n && S[i] != '-') { num = num * 10 + (S[i] - '0'); i++; } while (st.size() > lvl) st.pop(); TreeNode* temp = new TreeNode(num); if (!st.empty() && !st.top()->left) { st.top()->left = temp; } else if (!st.empty()) { st.top()->right = temp; } st.push(temp); } while (st.size() > 1) st.pop(); return st.empty() ? NULL : st.top(); } }; main(){ Solution ob; TreeNode *root = ob.recoverFromPreorder("1-2--3--4-5--6--7"); inord(root); }
Input
"1-2--3--4-5--6--7"
Output
3 2 4 1 6 5 7