解题思路:
- 根据前序遍历的特点“根,左,右”,得出前序遍历的第一个节点就是整棵树的根
- 根据中序遍历的特点“左,根,右”,找到中序遍历中和根节点相同的节点,也就是根节点的位置
- 在中序中,根节点左边的为整棵树的左子树,根节点后边的为整棵树的右子树,同时也就确定了左右子树的数量
- 在前序遍历和中序遍历中划分了左右子树节点的值之后,再用递归的方法分别构建左右子树
例如:
c代码如下:
typedef struct TreeNode
{
struct TreeNode *pLeft;
struct TreeNode *pRight;
char data;
}TreeNode;
TreeNode * CreateNode(char data)
{
TreeNode *pNode = (TreeNode *)malloc(sizeof(TreeNode));
assert(pNode != NULL);
pNode->pLeft = pNode->pRight = NULL;
pNode->data = data;
return pNode;
}
TreeNode *CreateTreeByPreAndIn(
char preOrder[],int preOrdersize,
char inOrder[],int inOrdersize)
{
if (preOrdersize < 0)
{
return NULL;
}
//根节点的值
char root = preOrder[0];
//在中序中找根节点的位置
int i;
for (i = 0; i < inOrdersize; i++)
{
if (root == inOrder[i])
{
break;
}
}
//如果找不到,代表这棵树不存在
if (i == inOrdersize)
{
return NULL;
}
////找到后构建整棵树的根节点
//TreeNode *pRoot = (TreeNode*)malloc(sizeof(TreeNode));
//assert(pRoot);
//pRoot->data = root;
//pRoot->pLeft = pRoot->pRight = NULL;
TreeNode *pRoot = CreateNode(root);
//递归的构建左右子树
pRoot->pLeft = CreateTreeByPreAndIn(
preOrder + 1, i,
inOrder, i);
pRoot->pRight = CreateTreeByPreAndIn(
preOrder + 1 + i, preOrdersize - 1 - i,
inOrder + 1 + i, inOrdersize - 1 - i);
return pRoot;
}