根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树所以必须要知道:必须知道中序遍历。
根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树。
例:若已知一棵二叉树的前序序列和中序序列分别为:
前序: A B D E C F G H
中序: D B E A G F H C
试画出这棵二叉树的逻辑结构示意图。
思路就是以上的思路,具体代码如下:
// PreMid.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//找到每个元素在前序遍历中的位置
int find(const string &str, char c)
{
for (int i = 0; i < str.size(); ++ i)
if (c == str[i])
return i;
return -1;
}
//根据前序遍历和中序遍历求出后序遍历
bool PreMid(const string &pre, const string &mid)
{
if (pre.size() == 0)
return false;
if (pre.size() == 1)
{
cout <<"::"<<pre;
return true;
}
//根节点是第一个元素
int k = find(mid, pre[0]);//前序的第一个元素在中序中的位置
string pretmp = pre.substr(1, k);//作用是从1开始取两个字符
string midtmp = mid.substr(0, k);//作用是从0 开始取两个字符
PreMid(pretmp, midtmp);
pretmp = pre.substr(k + 1, pre.size() - k - 1);
midtmp = mid.substr(k + 1, mid.size() - k - 1);
PreMid(pretmp, midtmp);
//变成后序遍历要最后输出节点的值
cout << pre[0];
return true;
}
//根据后序遍历和中序遍历求出前序遍历
bool BackMid(const string &back, const string &mid)
{
if (back.size() == 0)
return false;
if (back.size() == 1)
{
cout << back;
return true;
}
//根节点是最后一个元素
int k = find(mid, back[back.size() - 1]);
//变成前序遍历要先输出节点的值
cout << back[back.size() - 1];
string backTmp = back.substr(0, k);
string midTmp = mid.substr(0, k);
BackMid(backTmp, midTmp);
backTmp = back.substr(k, back.size() - k - 1);
midTmp = mid.substr(k + 1, mid.size() - k - 1);
BackMid(backTmp, midTmp);
}
int main()
{
string pre, mid;
while (cin >> pre >> mid)//输入前序和中序的字符串
{
PreMid(pre, mid);//根据前序和中序求后序
cout << endl;
}
system("pause");
return 0;
}
// PreMid.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//找到每个元素在前序遍历中的位置
int find(const string &str, char c)
{
for (int i = 0; i < str.size(); ++ i)
if (c == str[i])
return i;
return -1;
}
//根据前序遍历和中序遍历求出后序遍历
bool PreMid(const string &pre, const string &mid)
{
if (pre.size() == 0)
return false;
if (pre.size() == 1)
{
cout <<"::"<<pre;
return true;
}
//根节点是第一个元素
int k = find(mid, pre[0]);//前序的第一个元素在中序中的位置
string pretmp = pre.substr(1, k);//作用是从1开始取两个字符
string midtmp = mid.substr(0, k);//作用是从0 开始取两个字符
PreMid(pretmp, midtmp);
pretmp = pre.substr(k + 1, pre.size() - k - 1);
midtmp = mid.substr(k + 1, mid.size() - k - 1);
PreMid(pretmp, midtmp);
//变成后序遍历要最后输出节点的值
cout << pre[0];
return true;
}
//根据后序遍历和中序遍历求出前序遍历
bool BackMid(const string &back, const string &mid)
{
if (back.size() == 0)
return false;
if (back.size() == 1)
{
cout << back;
return true;
}
//根节点是最后一个元素
int k = find(mid, back[back.size() - 1]);
//变成前序遍历要先输出节点的值
cout << back[back.size() - 1];
string backTmp = back.substr(0, k);
string midTmp = mid.substr(0, k);
BackMid(backTmp, midTmp);
backTmp = back.substr(k, back.size() - k - 1);
midTmp = mid.substr(k + 1, mid.size() - k - 1);
BackMid(backTmp, midTmp);
}
int main()
{
string pre, mid;
while (cin >> pre >> mid)//输入前序和中序的字符串
{
PreMid(pre, mid);//根据前序和中序求后序
cout << endl;
}
system("pause");
return 0;
}
结果如下:
程序满足结果要求