题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:
输入前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历序列为{4,7,2,1,5,3,8,6},
重建一颗二叉树。
代码如下:
#include<iostream>
#include<malloc.h>
#include <stdlib.h>
#include <assert.h>
using namespace std;
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *leftchild;
struct Node *rightchild;
}BinaryTreeNode;
BinaryTreeNode *AllocNode()
{
BinaryTreeNode *NewNode = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
if (NewNode == NULL) exit(1);
memset(NewNode, 0, sizeof(BinaryTreeNode));
return NewNode;
}
void PreOrder(BinaryTreeNode *ptr)
{
if (ptr != NULL)
{
cout << ptr->data << " ";
PreOrder(ptr->leftchild);
PreOrder(ptr->rightchild);
}
}
int FindPos(int *inorder, int value, int nlength)
{
for (int i = 0; i<nlength; ++i)
{
if (inorder[i] == value)
{
return i;
}
}
return -1;
}
BinaryTreeNode *CreateTreePI(int *preorder, int *inorder, int nlength)
{
assert(preorder != NULL && inorder != NULL);
BinaryTreeNode *BTNode = NULL;
if (nlength > 0)
{
BTNode= AllocNode();
BTNode->data = preorder[0];
int pos = FindPos(inorder, preorder[0], nlength);
if (pos == -1) exit(1);
BTNode->leftchild = CreateTreePI(preorder + 1, inorder, pos);
BTNode->rightchild = CreateTreePI(preorder + pos + 1, inorder + pos + 1, nlength - pos - 1);
}
return BTNode;
}
int main()
{
int preorder[] = { 1, 2, 4, 7, 3, 5, 6, 8 };
int inorder[] = { 4, 7, 2, 1, 5, 3, 8, 6 };
int nlength = sizeof(preorder) / sizeof(preorder[0]);
BinaryTreeNode *Root = CreateTreePI(preorder, inorder, nlength);
PreOrder(Root);
cout << endl;
return 0;
}