已知二叉树前序、中序遍历结果,求该二叉树的后序遍历

1. 根据给定的二叉树前序和中序遍历结果还原二叉树;

2. 将还原的二叉树以二叉树形式保存在内存中;

3. 对建立的二叉树进行后序遍历


代码如下:

#include <iostream>
#include <functional>
using namespace std;
/*
char str1[30];   //保存前序遍历字符串
char str2[30];  //保存后序遍历字符串
int loc;   //静态数组中已分配的结点个数
             //因为有多组样例输入,因此用loc记录每个样例的根结点的位置


struct Node
{
Node *lchild;  //指向当前结点的左孩子
Node *rchild;  //指向当前结点的右孩子
char c;   //代表结点的值
}tree[51];   //用数组存储树的各个结点,用指针代表各结点之间的关系
  //注意,指针指向的是各结点的数组地址




Node *creat()    //初始化,返回的是一Node型指针
{
tree[loc].lchild = NULL;
tree[loc].rchild = NULL;
return &tree[loc++];  //树的各结点是按分配的先后顺序存放在结构数组中
                    //但当前结点的左右孩子关系是靠指针说明的
}


void PostOrder(Node *T) //后序遍历,T是结构指针
{
if (T->lchild!=NULL)   //后序遍历先左孩子后右孩子最后双亲
{
PostOrder(T->lchild);
}
if (T->rchild!=NULL)
{
PostOrder(T->rchild);
}
cout << T->c;  //输出双亲结点
}


//由字符串的前序和中序遍历得到原树,返回原树的根结点
Node *build(int s1, int e1, int s2, int e2)  //传入的参数是字符串的下标
{
//前序遍历结果为str1[s1]-str1[e1],后序遍历结果为str2[s2]-str2[e2]
Node *ret = creat();  //为该树的根结点申请空间,ret指向树的根结点,是一个结构指针
ret->c = str1[s1];
int rootInx = 0;   //根结点在中序遍历中的位置,以此划分递归阶段
for (int i = s2; i <= e2; i++)
{
if (str2[i]==ret->c)
{
rootInx = i;
break;
}
}
if (rootInx!=s2)   //原树有左子树
{
ret->lchild = build(s1 + 1, rootInx - s2 + s1, s2, rootInx - 1);
}
if (rootInx!=e2)  //原树有右子树
{
ret->rchild = build(rootInx - s2 + s1 + 1, e1, rootInx + 1, e2);
}
return ret;  //返回原树的根结点指针
}


int main()
{
while (cin>>str1>>str2)
{
loc = 0; //初始化静态内存空间中已经使用的结点个数
int len1 = strlen(str1);
int len2 = strlen(str2);
Node *root = build(0,len1-1,0,len2-1);
PostOrder(root);
cout << endl;
}
return 0;
}*/

猜你喜欢

转载自blog.csdn.net/qq_29442755/article/details/79571934
今日推荐