数据结构实验之求二叉树后序遍历和层次遍历
2016-08-09 14:48
281 查看
数据结构实验之求二叉树后序遍历和层次遍历
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
char data;
struct node *left;
struct node *right;
};
struct node* create(char pre[],char in[],int n)
{
struct node *root;
//int p;
root=new node;
if(n==0) return NULL;
root->data=pre[0];
int m=strchr(in,pre[0])-in; //函数strchr(string s,char c);表示查找字符c在字符串 s 中的位置,并返回这个位置
//求左子树的结点的个数
root->left=create(pre+1,in,m); //递归求得左右子树,pre+1,越过头结点,从pre第二个开始找,in从第一个开始找,一共建立m个结点。
root->right=create(pre+m+1,in+m+1,n-m-1);//pre+m+1越过头结点1和左子树的m,从pre+m+1开始,in 越过m个左子树的节点数和中间的根节点的个数,建立的 节点个数为总数减去左子树再减去1根节点
return root;
}
void houxv(struct node *root)
{
if(root)
{
houxv(root->left);
houxv(root->right);
cout<<root->data;
}
}
void cengci(struct node *root)
{
queue<node*>q;
if(root)
q.push(root);
node *temp=new node;
while(!q.empty())
{
temp=q.front(); q.pop();
if(temp)
{
cout<<temp->data;
q.push(temp->left);
q.push(temp->right);
}
}
}
int main()
{
char pre[1000],in[1000];
int n;
struct node*root;
root=new node;
cin>>n;
//getchar();
while(n--)
{
cin>>pre;
cin>>in;
int m=strlen(pre);
root=create(pre,in,m);
houxv(root);
cout<<endl;
cengci(root);
cout<<endl;
}
return 0;
}
数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。输出
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列示例输入
2 abdegcf dbgeafc xnliu lnixu
示例输出
dgebfca abcdefg linux xnuli
提示
知道先序和中序求后序的方法。先序第一个为根,在中序中找到这个根,根左边是他的左子树,右边是右子树。依次递归#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
char data;
struct node *left;
struct node *right;
};
struct node* create(char pre[],char in[],int n)
{
struct node *root;
//int p;
root=new node;
if(n==0) return NULL;
root->data=pre[0];
int m=strchr(in,pre[0])-in; //函数strchr(string s,char c);表示查找字符c在字符串 s 中的位置,并返回这个位置
//求左子树的结点的个数
root->left=create(pre+1,in,m); //递归求得左右子树,pre+1,越过头结点,从pre第二个开始找,in从第一个开始找,一共建立m个结点。
root->right=create(pre+m+1,in+m+1,n-m-1);//pre+m+1越过头结点1和左子树的m,从pre+m+1开始,in 越过m个左子树的节点数和中间的根节点的个数,建立的 节点个数为总数减去左子树再减去1根节点
return root;
}
void houxv(struct node *root)
{
if(root)
{
houxv(root->left);
houxv(root->right);
cout<<root->data;
}
}
void cengci(struct node *root)
{
queue<node*>q;
if(root)
q.push(root);
node *temp=new node;
while(!q.empty())
{
temp=q.front(); q.pop();
if(temp)
{
cout<<temp->data;
q.push(temp->left);
q.push(temp->right);
}
}
}
int main()
{
char pre[1000],in[1000];
int n;
struct node*root;
root=new node;
cin>>n;
//getchar();
while(n--)
{
cin>>pre;
cin>>in;
int m=strlen(pre);
root=create(pre,in,m);
houxv(root);
cout<<endl;
cengci(root);
cout<<endl;
}
return 0;
}
相关文章推荐
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之求二叉树后序遍历和层次遍历