面试题07. 重建二叉树
难度中等
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / 9 20 / 15 7
限制:
0 <= 节点个数 <= 5000
思路:在先序遍历的数据中确定根节点,在中序遍历的数据中确定左右子树。利用后序遍历,中序遍历数据恢复二叉树方法相似,只需做一些细微的改动。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 11 struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){ 12 struct TreeNode *root; 13 int i; 14 if(preorderSize<=0){ 15 return NULL; 16 } 17 root=(struct TreeNode*)malloc(sizeof(struct TreeNode)); 18 root->val=*preorder; 19 for(i=0;i<inorderSize;i++){ 20 if(inorder[i]==preorder[0]){ 21 break; 22 } 23 } 24 root->left=buildTree(preorder+1,i,inorder,i); 25 root->right=buildTree(preorder+i+1,preorderSize-i-1,inorder+i+1,inorderSize-i-1); 26 return root; 27 }