输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
- 二叉树中每个节点的值都互不相同;
- 输入的前序遍历和中序遍历一定合法;
数据范围
树中节点数量范围 [0,100][0,100]。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* buildTree(int* preorder, int preorder_size, int* inorder, int inorder_size) {
if(preorder_size<=0||inorder_size<=0||!preorder||!inorder||preorder_size!=inorder_size) return NULL;
int val=preorder[0]; //当前树的根节点数据就是前序序列的第一个位置的值
struct TreeNode* btNode=(struct TreeNode*)malloc(sizeof(struct TreeNode));
btNode->val=val;
btNode->left=NULL;
btNode->right=NULL;
if(preorder_size==1) return btNode; //只有一个结点直接返回
int leftlen=0,index=0; //计算左子树的长度,即遍历中序序列,在遇到根节点后停止,这一段的长度就是左子树的中序序列
while(inorder[index]!=val&&index<inorder_size)
{
index++;leftlen++;
}
int rightlen=preorder_size-leftlen-1;
if(leftlen>0) //若左子树非空,构建左子树
btNode->left=buildTree(preorder+1,leftlen,inorder,leftlen);
if(rightlen>0) //若右子树非空,构建右子树
btNode->right=buildTree(preorder+1+leftlen,rightlen,inorder+1+leftlen,rightlen);
return btNode; //返回所构建的结点
}