#include "iostream"
using namespace std;
typedef char ELEM_TYPE;
typedef unsigned char INT8U;
typedef unsigned short int INT16U;
typedef struct BiTNode
{
ELEM_TYPE data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}Node,*pNode;
pNode rebulid(ELEM_TYPE* pre_str,ELEM_TYPE* in_str,INT16U node_num);//pPRoot 根节点的地址的地址
void PostOrderTraverse(pNode pRoot);
int main(void)
{
pNode pRoot = rebulid("ABCEDFGH","ECBDAGFH",8);
PostOrderTraverse(pRoot);
return 0;
}
int get_root_pos(ELEM_TYPE* str,ELEM_TYPE ch)
{
int pos = 0;
while(ch!=*str && '\0'!=*str)
{
str++;
pos++;
}
if('\0'==*str)
return -1;
else
return pos;
}
pNode rebulid(ELEM_TYPE* pre_str,ELEM_TYPE* in_str,INT16U node_num)
{
pNode pRoot = new Node;
if(NULL==pRoot || 0==node_num)
{
return NULL;
}
else
{
INT16U root_pos = get_root_pos(in_str,pre_str[0]); //得到根节点在中序遍历中的位置
pRoot->data = pre_str[0];
if(root_pos >= node_num-1)
{
pRoot->rchild = NULL;
}
if(0 == root_pos)
{
pRoot->lchild = NULL;
}
pRoot->lchild = rebulid(&pre_str[1],&in_str[0],root_pos);
pRoot->rchild = rebulid(&pre_str[root_pos+1],&in_str[root_pos+1],node_num-root_pos-1);
return pRoot;
}
}
void PostOrderTraverse(pNode pRoot)
{
if(NULL == pRoot)
{
return;
}
else
{
PostOrderTraverse(pRoot->lchild);
PostOrderTraverse(pRoot->rchild);
cout<<pRoot->data;
}
}
树的前序遍历:ABCEDFGH
树的中序遍历:ECBDAGFH
程序运行结果:树的后序遍历见下图