知道二叉树的前序遍历和中序遍历,可以唯一确定一颗二叉树,在实现的细节是判断当前结点是否 存在左子树和右子树,比如下面一棵二叉树包含了所有情况
前序遍历为:A BCD EFGH
中序遍历为:CDB A FEHG
根据前序遍历和中序遍历的特点,我们先找下根结点,首先前序遍历的第一个结点就是根节点,此处就是A,那么根据中序遍历,我们可以区分A的左子树和右子树。根据A在中序遍历的位置,可以知道,中序遍历A的位置左边是左子树,右边为右子树。这情况就可以用递归来实现了,每次都找根结点,直到最后只剩一个结点为出口
下面看具体实现
#include <iostream>
using namespace std;
typedef struct treeNode
{
char value;
treeNode *left;
treeNode *right;
}Node, *pNode;
void built(char pre[], char mid[], int len, pNode &phead)
{
if (len == 1)
{
phead = new Node();
phead->left = NULL;
phead->right = NULL;
phead->value = pre[0];
return;
}
int i = 0;
for (; i < len; i++)
{
if (pre[0] == mid[i])
{
phead = new Node();
phead->left = NULL;
phead->right = NULL;
phead->value = pre[0];
break;
}
}
if (i < len)
{
built(&pre[1], &mid[0], i, phead->left);
built(&pre[i+1], &mid[i+1], len-i-1, phead->right);
}
}
void pre_print(pNode phead)
{
if (phead == NULL)
return;
cout<<phead->value;
pre_print(phead->left);
pre_print(phead->right);
}
void mid_print(pNode phead)
{
if (phead == NULL)
return;
mid_print(phead->left);
cout<<phead->value;
mid_print(phead->right);
}
void destroy(pNode phead)
{
if (phead != NULL)
return;
pNode pleft = phead->left;
pNode pright = phead->right;
if (!pleft)
destroy(pleft);
if (!pright)
destroy(pright);
delete phead;
}
int main()
{
char pre[10] = {0};
char mid[10] = {0};
int len = 0;
int i = 0;
while (cin>>len)
{
for (i = 0; i < len; i++)
{
cin>>pre[i];
}
for (i = 0; i < len; i++)
{
cin>>mid[i];
}
// cout<<pre<<endl;
// cout<<mid<<endl;
pNode phead = NULL;
built(pre, mid, len, phead);
pre_print(phead);
cout<<endl;
mid_print(phead);
cout<<endl;
destroy(phead);
break;
}
return 0;
}
/*
8
A B C D E F G H
C D B A F E H G
*/