题目:
给出一课二叉树的中序排列与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度小于或等于8)。要求输入两个字符串,分别是中序排列和后序排列(每行一个字符串)。输出一个字符串,先序排列。
分析:
首先说明一下二叉树的概念。一颗非空的二叉树由根节点及左、右子树这三个基本部分组成。二叉树的遍历有三种常用方式,分别为先序遍历(根节点->左子树-> 右子树)、中序遍历(左子树-> 根节点 -> 右子树)和后序遍历(左子树-> 右子树-> 根节点)。
本题已知中序排列和后序排列,而后续遍历的最后一个字符就是这棵二叉树的根,然后在中序遍历中确定根的位置,根左边就是左子树,根右边就是右子树;将左子树和右子树提取出来,递归运行之前的方法就可以求得先序排列。
代码如下:
// Chapter11_11.cpp : Defines the entry point for the application.
// 给出一课二叉树的中序排列与后序排列。求出它的先序排列。
//(约定树结点用不同的大写字母表示,长度小于或等于8)
#include "stdafx.h"
#include
using namespace std;
//已知中序排列和后序排列,求先序排列
int tree(char *mid,char *last)
{
char t,*p,*q;
//如果无左子树,则返回0(退出此次递推)
if(!*mid)
return 0;
//后序遍历的最后一个字符((子)树中,在‘字符串’last中找)
p = last + strlen(last) - 1;
cout << p << ' ';
//strchr:查找‘字符串’mid中(首次出现)字符p(根节点/节点)的位置。
q = strchr(mid,*p);
//将输出过的字符赋为0(求左子树)
*p = 0;
//查找右子树第一个元素在‘字符串’last中的位置
//q - mid为左子树的元素个数
p = q - mid + last;
t = *p;
//将输出过的字符赋为0(在mid和last中)
*p = 0;
*q = 0;
//先遍历左子树
tree(mid,last);
*p = t; //(求右子树)
//再遍历右子树
tree(q+1,p);
}
int main()
{
char mid[100010];
char last[100010];
cin >> mid;
cin >> last;
tree(mid,last);
cout << endl;
system("pause");
return 0;
}
运行结果如下:
该二叉树为:
求解思路为:
为了更加清楚程序运行的顺序及结果,我们可以添加几行代码,打印各阶段的变量值,修改后的代码如下:
// Chapter11_11.cpp : Defines the entry point for the application.
// 给出一课二叉树的中序排列与后序排列。求出它的先序排列。
//(约定树结点用不同的大写字母表示,长度小于或等于8)
#include "stdafx.h"
#include
using namespace std;
//已知中序排列和后序排列,求先序排列
int tree(char *mid,char *last)
{
char t,*p,*q;
//如果无左子树,则返回0(退出此次递推)
if(!*mid)
return 0;
//后序遍历的最后一个字符((子)树中,在‘字符串’last中找)
p = last + strlen(last) - 1;
cout << p << endl;
//strchr:查找‘字符串’mid中(首次出现)字符p(根节点/节点)的位置。
q = strchr(mid,*p);
cout << "q= " << q << endl;
//将输出过的字符赋为0(求左子树)
*p = 0;
//查找右子树第一个元素在‘字符串’last中的位置
//q - mid为左子树的元素个数
p = q - mid + last;
cout << "p= " << p << endl;
t = *p;
//将输出过的字符赋为0(在mid和last中)
*p = 0;
*q = 0;
cout << "mid= " << mid << endl;
cout << "last= " << last << endl;
cout << "调用tree(mid,last)" << endl;
//先遍历左子树
tree(mid,last);
*p = t; //(求右子树)
cout << "调用tree(q+1,p)" << endl;
//再遍历右子树
tree(q+1,p);
}
int main()
{
char mid[100010];
char last[100010];
cin >> mid;
cin >> last;
cout << "调用tree(mid,last)" << endl;
tree(mid,last);
cout << endl;
system("pause");
return 0;
}
运行结果如下: