前序,中序,后序知二推一
求先序序列
题目描述
给出一棵二叉树的中序与后序排列,求出它的先序排列,(约定树结点用不同的大写字母表示,长度≤8)。
输入格式
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
1行,表示一棵二叉树的先序。
输入
BADC
BDCA
输出
ABCD
#include<iostream>
#include<string>
using namespace std;
string in;
string post;
struct TreeNode{
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char data):data(data),left(NULL),right(NULL){
}
};
TreeNode* Tree[10000];
TreeNode* CreatTree(int s1,int t1,int s2,int t2){
char c=post[t1];//后序的最后一个
if(s1==t1){
//叶子结点
Tree[c-'A']=new TreeNode(c);
return Tree[c-'A'];
}
Tree[c-'A']=new TreeNode(c);
int pos=in.find(c);//在中序中找到对应的顶点以及左右长度
int llen=pos-s2;
int rlen=t2-pos;
//别忘了判左右长度
if(llen) Tree[c-'A']->left=CreatTree(s1,s1+llen-1,s2,s2+llen-1);
if(rlen) Tree[c-'A']->right=CreatTree(s1+llen,t1-1,s2+llen+1,t2);
return Tree[c-'A'];
}
void PreOrder(TreeNode* root){
if(root==NULL) return ;
cout<<root->data;
PreOrder(root->left);
PreOrder(root->right);
}
int main(){
cin>>in>>post;
TreeNode* root=CreatTree(0,post.size()-1,0,in.size()-1);
PreOrder(root);
}
求可能中序序列
题目描述
已知前序和后序遍历的结果求出一种可能得中序遍历的结果,二叉树的结点名以大写字母(A,B,C…)表示,最多26个结点
输入格式
第一行为前序遍历结果
第二行为后序遍历结果
输出格式
一个字符串,表示一个可能的中序遍历
输入
ABDCE
DBECA
输出
DBAEC
#include<iostream>
#include<string>
using namespace std;
string pre,post;
struct TreeNode{
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char data):data(data),left(NULL),right(NULL){
}
};
TreeNode* PrePostCreat(string pre,string post){
TreeNode* root=new TreeNode(pre[0]);
if(pre.size()==0) return NULL;//返回
int pos=post.find(pre[1]);//先序顶点在后序的位置
// cout<<pre.substr(1,pos+1)<<" "<<post.substr(0,pos+1)<<endl;
// cout<<pre.substr(pos+2)<<" "<<post.substr(pos+1,post.size()-pos-2)<<endl;
root->left=PrePostCreat(pre.substr(1,pos+1),post.substr(0,pos+1));
root->right=PrePostCreat(pre.substr(pos+2),post.substr(pos+1,post.size()-pos-2));
return root;
}
void InOrder(TreeNode* T){
if(T==NULL) return ;
InOrder(T->left);
cout<<T->data;
InOrder(T->right);
}
int main(){
cin>>pre>>post;
TreeNode* root=PrePostCreat(pre,post);
InOrder(root);
}
二叉排序树
构造二叉排序树
题目描述
已知二叉排序树用二叉链表存储,结点的关键字为 1正整数。从键盘输入结点的关键字(以 0表示结束)建立一棵二叉排序树,并输出其后序遍历序列
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
struct TreeNode{
int data;
TreeNode* left;
TreeNode* right;
TreeNode(int data):data(data),