leetcode 105.从前序与中序遍历序列构造二叉树(construct binary tree from preorder and inorder traversal)C语言
1.description
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
2.solution
preorder第一个元素为root,在inorder里面找到root,在它之前的为左子树(长l1),之后为右子树(长l2)。preorder[1]到preorder[l1]为左子树,之后为右子树,分别递归。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* order(int pre_l, int pre_r, int in_l, int in_r, int* preorder, int* inorder){
if(pre_l > pre_r || in_l > in_r){
return NULL;
}
struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = preorder[pre_l];
int i;
for(i=in_l; i<in_r; ++i){
if(inorder[i] == preorder[pre_l]){
break;
}
}
root->left = order(pre_l+1, pre_l+i, in_l, i-1, preorder, inorder);
root->right = order(pre_l+i-in_l+1, pre_r, i+1, in_r, preorder, inorder);
return root;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
return order(0, inorderSize-1, 0, inorderSize-1, preorder, inorder);
}