Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
TreeNode *buildTreeCore(int *preorder, int prebegin, int preend, int *inorder, int inbegin, int inend) {
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = preorder[prebegin];
root->left = root->right = NULL;
//printf("%d ", root->val);
if(prebegin == preend || inbegin == inend) return root;
int i;
for(i = inbegin; i <= inend && inorder[i] != preorder[prebegin]; i++) ;
if(i > inbegin) {
root->left = buildTreeCore(preorder, prebegin + 1, prebegin + i, inorder, inbegin, i - 1);
}
if(i < inend) {
root->right = buildTreeCore(preorder, prebegin + i + 1, preend, inorder, i + 1,inend);
}
return root;
}
TreeNode *buildTree(int *preorder, int *inorder, int n) {
if(preorder == NULL || inorder == NULL) return NULL;
TreeNode *root = buildTreeCore(preorder, 0, n - 1, inorder, 0, n - 1);
return root;
}
void Travel(TreeNode *root) {
if(root != NULL) {
Travel(root->left);
Travel(root->right);
printf("%d,", root->val);
}
}
void main() {
int pre[] = {-1};
int in[] = {-1};
TreeNode* root = buildTree(pre, in, 1);
Travel(root);
}