Leetcode versions of this problem:
Let’s say we have this tree:
Let us consider the below traversals:
- Preorder (NLR) sequence:
A B D E C F
- Inorder (LNR) sequence:
D B E A F C
Solution
- In a pre-order sequence, the leftmost element is the root of the tree. So we know
A
is the root for given sequences. - By searching
A
in the in-order sequence, we can find out all elements on the left side ofA
is in the left subtree and elements on right in the right subtree. - We can recursively follow the above steps and reconstruct the tree.
// Base node
class Node {
public:
char data;
Node* data;
Node* right
}
Node* buildTree(char in[], char pre[], int inStart, int inEnd)
{
// inStart and inEnd represent the indices within the `in[]` array
static int preIndex = 0;
if (inStart > inEnd)
return NULL;
/* Pick current node from preorder
traversal using preIndex and increment preIndex */
Node* tNode = newNode(pre[preIndex++]);
/* If this node has no children then return */
if (inStart == inEnd)
return tNode;
/* Else find the index of this node in in-order traversal */
int inIndex = search(in, inStart, inEnd, tNode->data);
/* Using index in in-order traversal, construct left and
right subtress */
tNode->left = buildTree(in, pre, inStart, inIndex - 1);
tNode->right = buildTree(in, pre, inIndex + 1, inEnd);
return tNode;
}
// Helper function that allocates a new node with the given data and NULL left and right pointers
Node* newNode(char data) {
node* Node = new node();
Node->data = data;
Node->left = NULL;
Node->right = NULL;
return (Node);
}
/* Function to find index of value in arr[start...end]
The function assumes that value is present in in[] */
int search(char arr[], int strt, int end, char value) {
int i;
for (i = strt; i <= end; i++) {
if (arr[i] == value)
return i;
}
return -1; // Add this line to handle cases where 'value' is not found in 'arr'.
}