题目简介:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树,假设输入的前序遍历和中序遍历的结果都不含重复数字。
思路:
首先我们先确定前序序列也就是先根遍历,先遍历根节点,在遍历左子树,在遍历右子树。中序遍历也是就是中根遍历,先遍历左子树,再遍历根节点,再遍历右子树。所以在同时知道前序遍历序列和中序遍历序列时,我们就很好的可以从中划分出哪一部分是左子树,哪一部分是右子树,因为前序遍历序列里的第一个数就是根节点的值,然后再把这个值对照到中序遍历的序列中,这时就能判断根节点左边的是左子树,右边的是右子树。按照这样的思路,进行递归就能实现这个二叉树。
代码实现:
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
if(!preorderSize)
return NULL;
struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = preorder[0];
root ->left = NULL;
root->right =NULL;
int i = 0 ;
for(; i < inorderSize ;i++){
if(inorder[i] == preorder[0])
break;
}
if(i) root->left = buildTree(preorder+1,i,inorder,i);
if(inorderSize-i-1) root->right = buildTree(preorder+i+1,inorderSize-i-1 , inorder+1+i ,inorderSize-i-1);
return root;
}