已知中序与后序,或者中序与先序,构造二叉树
来源:互联网 发布:java泛型教程 编辑:程序博客网 时间:2024/05/02 04:19
/*
Name: 已知中序与后序,或者中序与先序,构造二叉树
Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和出处
Author: goal00001111
Date: 08-12-08 11:42
Description:
描述 Description
给出一棵二叉树的中序与后序排列。求出它的先序排列。
给出一棵二叉树的中序与先序排列。求出它的后序排列。
*/
#include<iostream>
#include<string>
using namespace std;
typedef struct BTNode{
char data;
struct BTNode *lc, *rc;//左,右孩子指针
} *BTree;
void PostBtree(BTree & t, string mid, string post, int lm, int rm, int lp, int rp);
void PreBtree(BTree & t, string mid, string pre, int lm, int rm, int lp, int rp);
void Preorder(BTree p); //先序遍历
void Postorder(BTree p); //后序遍历
int main(int argc, char* argv[])
{
string pre, mid, post;
BTree root1, root2;
cout << "输入中序序列" << endl;
cin >> mid;
cout << "输入后序序列" << endl;
cin >> post;
PostBtree(root1, mid, post, 0, mid.size()-1, 0, post.size()-1);
Preorder(root1);
cout << endl;
cout << "输入前序序列" << endl;
cin >> pre;
PreBtree(root2, mid, pre, 0, mid.size()-1, 0, pre.size()-1);
Postorder(root2);
system("pause");
return 0;
}
/*
函数名称:PostBtree
函数功能:给出一棵二叉树的中序与后序序列,构造这棵二叉树。
输入参数: BTree & t:二叉树的结点t
string mid:存储了二叉树的中序序列的字符串
string post:存储了二叉树的后序序列的字符串
int lm, int rm:二叉树的中序序列在数组mid中的左右边界
int lp, int rp:二叉树的后序序列在数组post中的左右边界
*/
void PostBtree(BTree & t, string mid, string post, int lm, int rm, int lp, int rp)
{
t = new BTNode; //构造二叉树根结点
t->data = post[rp];
t->lc = t->rc = NULL;
int pos = lm;
while (mid[pos] != post[rp])
pos++;
int lenL = pos - lm;
if (pos > lm)//有左孩子,递归构造左子树
PostBtree(t->lc, mid, post, lm, pos-1, lp, lp+lenL-1);
if (pos < rm)//有右孩子,递归构造右子树
PostBtree(t->rc, mid, post, pos+1, rm, lp+lenL, rp-1);
}
/*
函数名称:PreBtree
函数功能:给出一棵二叉树的中序与先序序列,构造这棵二叉树。
输入参数: BTree & t:二叉树的结点t
string mid:存储了二叉树的中序序列的字符串
string pre:存储了二叉树的先序序列的字符串
int lm, int rm:二叉树的中序序列在数组mid中的左右边界
int lp, int rp:二叉树的先序序列在数组post中的左右边界
*/
void PreBtree(BTree & t, string mid, string pre, int lm, int rm, int lp, int rp)
{
t = new BTNode; //构造二叉树根结点
t->data = pre[lp];
t->lc = t->rc = NULL;
int pos = lm;
while (mid[pos] != pre[lp])
pos++;
int lenL = pos - lm;
if (pos > lm)//有左孩子,递归构造左子树
PreBtree(t->lc, mid, pre, lm, pos-1, lp+1, lp+lenL);
if (pos < rm)//有右孩子,递归构造右子树
PreBtree(t->rc, mid, pre, pos+1, rm, lp+lenL+1, rp);
}
//先序遍历
void Preorder(BTree p)
{
if(p != NULL)
{
cout << p->data; //输出该结点
Preorder(p->lc); //遍历左子树
Preorder(p->rc); //遍历右子树
}
}
//后序遍历
void Postorder(BTree p)
{
if(p != NULL)
{
Postorder(p->lc); //遍历左子树
Postorder(p->rc); //遍历右子树
cout << p->data; //输出该结点
}
}
Name: 已知中序与后序,或者中序与先序,构造二叉树
Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和出处
Author: goal00001111
Date: 08-12-08 11:42
Description:
描述 Description
给出一棵二叉树的中序与后序排列。求出它的先序排列。
给出一棵二叉树的中序与先序排列。求出它的后序排列。
*/
#include<iostream>
#include<string>
using namespace std;
typedef struct BTNode{
char data;
struct BTNode *lc, *rc;//左,右孩子指针
} *BTree;
void PostBtree(BTree & t, string mid, string post, int lm, int rm, int lp, int rp);
void PreBtree(BTree & t, string mid, string pre, int lm, int rm, int lp, int rp);
void Preorder(BTree p); //先序遍历
void Postorder(BTree p); //后序遍历
int main(int argc, char* argv[])
{
string pre, mid, post;
BTree root1, root2;
cout << "输入中序序列" << endl;
cin >> mid;
cout << "输入后序序列" << endl;
cin >> post;
PostBtree(root1, mid, post, 0, mid.size()-1, 0, post.size()-1);
Preorder(root1);
cout << endl;
cout << "输入前序序列" << endl;
cin >> pre;
PreBtree(root2, mid, pre, 0, mid.size()-1, 0, pre.size()-1);
Postorder(root2);
system("pause");
return 0;
}
/*
函数名称:PostBtree
函数功能:给出一棵二叉树的中序与后序序列,构造这棵二叉树。
输入参数: BTree & t:二叉树的结点t
string mid:存储了二叉树的中序序列的字符串
string post:存储了二叉树的后序序列的字符串
int lm, int rm:二叉树的中序序列在数组mid中的左右边界
int lp, int rp:二叉树的后序序列在数组post中的左右边界
*/
void PostBtree(BTree & t, string mid, string post, int lm, int rm, int lp, int rp)
{
t = new BTNode; //构造二叉树根结点
t->data = post[rp];
t->lc = t->rc = NULL;
int pos = lm;
while (mid[pos] != post[rp])
pos++;
int lenL = pos - lm;
if (pos > lm)//有左孩子,递归构造左子树
PostBtree(t->lc, mid, post, lm, pos-1, lp, lp+lenL-1);
if (pos < rm)//有右孩子,递归构造右子树
PostBtree(t->rc, mid, post, pos+1, rm, lp+lenL, rp-1);
}
/*
函数名称:PreBtree
函数功能:给出一棵二叉树的中序与先序序列,构造这棵二叉树。
输入参数: BTree & t:二叉树的结点t
string mid:存储了二叉树的中序序列的字符串
string pre:存储了二叉树的先序序列的字符串
int lm, int rm:二叉树的中序序列在数组mid中的左右边界
int lp, int rp:二叉树的先序序列在数组post中的左右边界
*/
void PreBtree(BTree & t, string mid, string pre, int lm, int rm, int lp, int rp)
{
t = new BTNode; //构造二叉树根结点
t->data = pre[lp];
t->lc = t->rc = NULL;
int pos = lm;
while (mid[pos] != pre[lp])
pos++;
int lenL = pos - lm;
if (pos > lm)//有左孩子,递归构造左子树
PreBtree(t->lc, mid, pre, lm, pos-1, lp+1, lp+lenL);
if (pos < rm)//有右孩子,递归构造右子树
PreBtree(t->rc, mid, pre, pos+1, rm, lp+lenL+1, rp);
}
//先序遍历
void Preorder(BTree p)
{
if(p != NULL)
{
cout << p->data; //输出该结点
Preorder(p->lc); //遍历左子树
Preorder(p->rc); //遍历右子树
}
}
//后序遍历
void Postorder(BTree p)
{
if(p != NULL)
{
Postorder(p->lc); //遍历左子树
Postorder(p->rc); //遍历右子树
cout << p->data; //输出该结点
}
}
- 已知中序与后序,或者中序与先序,构造二叉树
- 已知中序与后序,或者中序与先序,构造二叉树
- 已知中序与后序,或者中序与先序,构造二叉树
- 已知先序+中序构造二叉树,已知后序+中序构造二叉树(C语言)
- 二叉树构造 (已知先序 和中序)
- 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 树的遍历 之 已知后序与中序输出先序
- 先序和后序构造二叉树,后序和中序构造二叉树
- 已知树的中序+后序/先序遍历,建立二叉树
- 已知二叉树的先序、中序遍历序列,求其后序遍历结果。(hduoj1710)
- 二叉树已知先序遍历和中序遍历得到后序遍历
- 数据结构与算法学习之二叉树的遍历:已知先序、中序、后序序列三者中的两种求另外一种遍历的算法
- 二叉树——已知先序、中序,求后序
- 已知先序序列、中序序列创建二叉树
- 已知前序(先序)与中序输出后序
- 已知后序与中序输出前序(先序)
- 已知后序与中序输出前序(先序)
- 已知前序(先序)与中序输出后序
- 英语六级作文
- 16位先行进位加法器--原理篇
- 朋友间是没有压力的...
- Eclipse 实用快捷键大全
- CHKJ3000E错误解决
- 已知中序与后序,或者中序与先序,构造二叉树
- 中央经济工作会议落幕 提出明年经济工作任务
- http协议
- [转贴]希腊字母读音表
- 使用javascript在客户端通过 XSLT 将 XML 文档转换为 XHTML,兼容IE和Firefox
- 在jsp中添加web service
- 待业白领建不景气网 称沪指重上6千点就关网站
- 二行CSS代码清除所有网页木马
- SVN解决冲突的办法