智能手机知名浏览器面试题目---已知树的前序遍历和中序遍历,求树的后序遍历结果
来源:互联网 发布:北京铭万网络 编辑:程序博客网 时间:2024/04/29 12:29
根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树所以必须要知道:必须知道中序遍历。
根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树。
例:若已知一棵二叉树的前序序列和中序序列分别为:
前序: 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;}
结果如下:
程序满足结果要求
- 智能手机知名浏览器面试题目---已知树的前序遍历和中序遍历,求树的后序遍历结果
- 已知二叉树的前序遍历和中序遍历,求二叉树的后序遍历
- 已知前序遍历序列和中序遍历序列,求二叉树的后序遍历
- 树的遍历-已知中序+(前序|后序)求层次遍历
- 二叉树遍历问题:已知中序遍历和后序遍历结果,求前序遍历结果
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知前序遍历和中序遍历的结果求后序遍历
- 已知二叉树的后序/前序遍历和中序遍历,求前序/中序遍历
- 对于已知二叉树的中序遍历和后序遍历如何求二叉树的的前序遍历
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法
- 二叉树的遍历(前序 中序 后序)和已知两种遍历顺序求另外一种遍历顺序(含实例)
- 已知树的前序遍历和中序遍历,求后序遍历的方法(转)
- Head First 软件开发(Software Development) 1-3 Software, Requirement, Planning
- Java 性能优化之 String 篇
- 动态库与静态库的区别
- 随机生成密码
- 2012.6.19.sql不常用函数总结,以及事务,增加,删除触发器
- 智能手机知名浏览器面试题目---已知树的前序遍历和中序遍历,求树的后序遍历结果
- 存储器 主存储器(内存)
- 剑法三套,程序员也能挣大钱
- 神奇的求平均数
- android:hint属性(没有输入内容之前的提示内容)
- libnids分析(6)
- 数值交换
- 《C++ primer Third edition》读书笔记
- c语言结构体的相互引用