程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。

题目:

给出一课二叉树的中序排列与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度小于或等于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;
}

运行结果如下: 

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第1张图片

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第2张图片

该二叉树为:

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第3张图片

求解思路为:

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第4张图片

为了更加清楚程序运行的顺序及结果,我们可以添加几行代码,打印各阶段的变量值,修改后的代码如下:

// 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;
}

运行结果如下: 

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第5张图片

程序基本算法习题解析 给出一课二叉树的中序排列与后序排列,求出它的先序排列。_第6张图片

 

你可能感兴趣的:(程序基本算法习题解析)