Problem Description
已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点)。请建立二叉树并按中序和后序的方式遍历该二叉树。
Input
连续输入多组数据,每组数据输入一个长度小于50个字符的字符串。
Output
每组输入数据对应输出2行:
第1行输出中序遍历序列;
第2行输出后序遍历序列。
Example Input
abc,,de,g,,f,,,
Example Output
cbegdfacgefdba
01
#include<bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node *l,*r;
07
};
08
char
st[51];
09
int
cnt;
10
struct
node *creat()
11
{
12
struct
node*root;
13
if
(st[++cnt]==
','
)
14
root=NULL;
15
else
16
{
17
root=
new
node;
18
root->data=st[cnt];
19
root->l=creat();
20
root->r=creat();
21
}
22
return
root;
23
}
24
void
zhongxu(
struct
node*root)
25
{
26
if
(root)
27
{
28
zhongxu(root->l);
29
cout<<root->data;
30
zhongxu(root->r);
31
}
32
}
33
void
houxu(
struct
node*root)
34
{
35
if
(root)
36
{
37
houxu(root->l);
38
houxu(root->r);
39
cout<<root->data;
40
}
41
}
42
int
main()
43
{
44
while
(cin>>st)
45
{
46
cnt=-1;
47
struct
node *root;
48
root=creat();
49
zhongxu(root);
50
cout<<endl;
51
houxu(root);
52
cout<<endl;
53
}
54
return
0;
55
}
注意if else的联动性。
56
Problem Description
输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列。Input
第一行输入二叉树的先序遍历序列; 第二行输入二叉树的中序遍历序列。Output
输出该二叉树的后序遍历序列。Example Input
ABDCEF BDAECFExample Output
DBEFCA
01
#include<bits/stdc++.h>
02
03
struct
node
04
{
05
char
data;
06
struct
node *lch,*rch;
07
};
08
void
pai(
char
*xian,
char
*zhong,
int
len)
09
{
10
11
if
(len==0)
12
return
;
13
node *t=
new
node;
14
t->data=*xian;
15
int
i=0;
16
for
(;i<len;i++)
17
{
18
if
(zhong[i]==*xian)
19
break
;
20
}
21
pai(xian+1,zhong,i);
22
pai(xian+i+1,zhong+i+1,len-i-1);
23
printf
(
"%c"
,t->data);
24
return
;
25
}
26
int
main()
27
{
28
char
zhong[100],xian[100];
29
int
i,len;
30
gets
(xian);
31
gets
(zhong);
32
len=
strlen
(zhong);
33
pai(xian,zhong,len);
34
printf
(
"\n"
);
35
return
0;
36
}
37
数据结构实验之二叉树五:层序遍历
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
Input
输入数据有多行,第一行是一个整数 t (t<1000) ,代表有 t 行测试数据。每行是一个长度小于 50 个字符的字符串。Output
输出二叉树的层次遍历序列。Example Input
2 abd,,eg,,,cf,,, xnl,,i,,u,,Example Output
abcdefg xnuli
01
#include <bits/stdc++.h>
02
03
using
namespace
std;
04
05
struct
node
06
{
07
char
data;
08
struct
node *l,*r;
09
};
10
char
st[51];
11
12
int
cnt;
13
14
struct
node*creat()
15
{
16
char
c=st[cnt++];
17
struct
node*root;
18
if
(c==
','
)
19
root=NULL;
20
else
21
{
22
root=
new
node;
23
root->data=c;
24
root->l=creat();
25
root->r=creat();
26
}
27
return
root;
28
}
29
void
ceng(
struct
node *root)
30
{
31
int
out=0;
32
int
in=0;
33
struct
node*q[10010];
34
q[in++]=root;
35
while
(out<in)
36
{
37
if
(q[out])
38
{
39
cout<<q[out]->data;
40
q[in++]=q[out]->l;
41
q[in++]=q[out]->r;
42
}
43
out++;
44
}
45
}
46
int
main()
47
{
48
int
t;
49
cin>>t;
50
while
(t--)
51
{
52
cnt=0;
53
cin>>st;
54
struct
node*root;
55
root=creat();
56
ceng (root);
57
cout<<endl;
58
}
59
return
0;
60
}
01
#include <iostream>
02
#include<cstring>
03
using
namespace
std;
04
struct
code
05
{
06
char
s;
07
struct
code *l,*r;
08
};
09
char
st[100];
10
int
top=-1;
11
struct
code *creat()
12
{
13
struct
code *p;
14
if
(st[++top]==
','
)
15
p=NULL;
16
else
17
{
18
p=
new
code;
19
p->s=st[top];
20
p->l=creat();
21
p->r=creat();
22
}
23
return
p;
24
}
25
void
cx(code *t)
26
{
27
int
in=0,out=0;
28
code*temp[100];
29
temp[in++]=t;
30
while
(in>out)
31
{
32
if
(temp[out])
33
{
34
cout<<temp[out]->s;
//只要不是空节点就往外输出,而且一定是一层一层的往外出
35
36
temp[in++]=temp[out]->l;
//上一层出去一个我就把他的左右字数往里进来,
37
temp[in++]=temp[out]->r;
//通过whil循环把所有层遍历一遍,
38
//由于队列思想进只会往后面放出从前面出,所以 代码符合层次遍历的从上到下从左到右的要求
39
}
40
out++;
41
}
42
}
43
int
main()
44
{
45
int
n;
46
cin>>n;
47
while
(n--)
48
{
49
cin>>st;
50
top=-1;
51
struct
code *p;
52
p=creat();
53
cx(p);
54
cout<<endl;
55
}
56
return
0;
57
}
58
层序遍历代码。
数据结构实验之二叉树三:统计叶子数
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点)。请建立二叉树并求二叉树的叶子结点个数。
Input
连续输入多组数据,每组数据输入一个长度小于50个字符的字符串。
Output
输出二叉树的叶子结点个数。
Example Input
abc,,de,g,,f,,,Example Output
3
#include<bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node*l,*r;
07
}*root;
08
char
st[55];
09
int
cnt,cont;
10
struct
node*creat()
11
{
12
struct
node *root;
13
if
(st[cnt++]==
','
)
14
root=NULL;
15
else
16
{
17
root=
new
node;
18
root->data=st[cnt-1];
19
root->l=creat();
20
root->r=creat();
21
}
22
return
root;
23
}
24
int
jiedian(
struct
node *root)
25
{
26
if
(root)
27
{
28
if
((root->l==NULL)&&(root->r==NULL))
29
cont++;
30
jiedian(root->l);
31
jiedian(root->r);
32
}
33
return
0;
34
}
35
int
main()
36
{
37
while
(cin>>st)
38
{
39
cnt=0;
40
cont=0;
41
root=creat();
42
jiedian(root);
43
cout<<cont<<endl;
44
}
45
return
0;
46
}
数据结构实验之二叉树七:叶子问题
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。
Input
输入数据有多行,每一行是一个长度小于 50 个字符的字符串。Output
按从上到下从左到右的顺序输出二叉树的叶子结点。Example Input
abd,,eg,,,cf,,, xnl,,i,,u,,Example Output
层序遍历再加个是否是叶子判断输出就可以dfg uli
01
#include<bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node*l,*r;
07
};
08
char
s[100];
09
int
cnt;
10
struct
node*creat()
11
{
12
struct
node *root;
13
if
(s[++cnt]==
','
)
14
root=NULL;
15
else
16
{
17
root=
new
node;
18
root->data=s[cnt];
19
root->l=creat();
20
root->r=creat();
21
}
22
return
root;
23
};
24
void
cengxu(
struct
node*root)
25
{
26
struct
node*temp[100];
27
int
in=0,out=0;
28
temp[in++]=root;
29
while
(in>out)
30
{
31
if
(temp[out])
32
{
33
if
(temp[out]->l==NULL&&temp[out]->r==NULL)
34
cout<<temp[out]->data;
35
temp[in++]=temp[out]->l;
36
temp[in++]=temp[out]->r;
37
}
38
out++;
39
}
40
}
41
int
main()
42
{
43
struct
node*root;
44
while
(cin>>s)
45
{
46
cnt=-1;
47
root=creat();
48
cengxu(root);
49
cout<<endl;
50
}
51
return
0;
52
}
数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
Input
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
Output
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。
Example Input
2 abdegcf dbgeafc xnliu lnixuExample Output
dgebfca abcdefg linux xnuli
01
#include<bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node *l,*r;
07
};
08
struct
node*creat(
int
n,
char
*str1,
char
*str2)
09
{
10
struct
node*root;
11
char
*p;
12
if
(n==0)
13
return
NULL;
14
root=
new
node;
15
root->data=str1[0];
16
for
(p=str2;p!=
'\0'
;p++)
17
if
(*p==str1[0])
18
break
;
19
int
t=p-str2;
20
root->l=creat(t,str1+1,str2);
21
root->r=creat(n-1-t,str1+1+t,p+1);
22
return
root;
23
}
24
void
houxu(
struct
node*root)
25
{
26
if
(root)
27
{
28
houxu(root->l);
29
houxu(root->r);
30
cout<<root->data;
31
}
32
}
33
void
cengxu(
struct
node*root)
34
{
35
struct
node*temp[100];
36
int
in=0,out=0;
37
temp[in++]=root;
38
while
(in>out)
39
{
40
if
(temp[out])
41
{
42
cout<<temp[out]->data;
43
temp[in++]=temp[out]->l;
44
temp[in++]=temp[out]->r;
45
}
46
out++;
47
}
48
}
49
int
main()
50
{
51
int
n;
52
char
str1[60],str2[60];
53
struct
node *root=
new
node;
54
cin>>n;
55
while
(n--)
56
{
57
cin>>str1>>str2;
58
int
n=
strlen
(str1);
59
root=creat(n,str1,str2);
60
houxu(root);
61
cout<<endl;
62
cengxu(root);
63
cout<<endl;
64
}
65
return
0;
66
}
数据结构实验之二叉树四:(先序中序)还原二叉树
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input
输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串。
Output
输出一个整数,即该二叉树的高度。
Example Input
9 ABDFGHIEC FDHGIBEACExample Output
5
01
#include <bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node *l,*r;
07
};
08
struct
node *creat(
int
n,
char
a[],
char
b[])
09
{
10
struct
node*root;
11
char
*p;
12
if
(n==0)
13
return
NULL;
14
root=
new
node;
15
root->data=a[0];
16
for
(p=b;p!=
'\0'
;p++)
17
if
(*p==a[0])
18
break
;
19
int
t;
20
t=p-b;
21
root->l=creat(t,a+1,b);
22
root->r=creat(n-1-t,a+t+1,p+1);
23
return
root;
24
}
25
int
deep(
struct
node *root)
26
{
27
int
d=0;
28
if
(root)
29
{
30
int
l1=deep(root->l);
31
int
l2=deep(root->r);
32
d=max(l1,l2)+1;
33
}
34
return
d;
35
}
36
int
main()
37
{
38
int
n,m;
39
char
a[102],b[103];
40
struct
node*root;
41
while
(cin>>n)
42
{
43
cin>>a>>b;
44
root=creat(n,a,b);
45
m=deep(root);
46
cout<<m<<endl;
47
}
48
return
0;
49
}
数据结构实验之二叉树的建立与遍历
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。Input
输入一个长度小于50个字符的字符串。Output
输出共有4行: 第1行输出中序遍历序列; 第2行输出后序遍历序列; 第3行输出叶子节点个数; 第4行输出二叉树深度。Example Input
abc,,de,g,,f,,,Example Output
cbegdfacgefdba35
01
#include <bits/stdc++.h>
02
using
namespace
std;
03
struct
node
04
{
05
char
data;
06
struct
node *l,*r;
07
};
08
char
st[105];
09
int
cnt=-1,cont=0;
10
struct
node *creat()
11
{
12
struct
node*root;
13
if
(st[++cnt]==
','
)
14
root=NULL;
15
else
16
{
17
root=
new
node;
18
root->data=st[cnt];
19
root->l=creat();
20
root->r=creat();
21
}
22
return
root;
23
}
24
int
jiedian(
struct
node*root)
25
{
26
if
(root)
27
{
28
if
((root->l==NULL)&&(root->r==NULL))
29
cont++;
30
jiedian(root->l);
31
jiedian(root->r);
32
}
33
return
0;
34
}
35
void
zhongxu(
struct
node *root)
36
{
37
if
(root)
38
{
39
zhongxu(root->l);
40
cout<<root->data;
41
zhongxu(root->r);
42
}
43
}
44
void
houxu(
struct
node *root)
45
{
46
if
(root)
47
{
48
houxu(root->l);
49
houxu(root->r);
50
cout<<root->data;
51
}
52
}
53
int
deep(
struct
node *root)
54
{
55
int
d=0;
56
if
(root)
57
{
58
int
l1=deep(root->l);
59
int
l2=deep(root->r);
60
d=max(l1,l2)+1;
61
}
62
return
d;
63
}
64
int
main()
65
{
66
struct
node*root=
new
node;
67
int
m;
68
cin>>st;
69
root=creat();
70
zhongxu(root);
71
cout<<endl;
72
houxu(root);
73
cout<<endl;
74
jiedian(root);
75
m=deep(root);
76
cout<<cont<<endl<<m<<endl;
77
return
0;
78
}
79
#include<bits/stdc++.h> using namespace std; char a[100],b[100]; struct node { char data; struct node *lchild,*rchild; }; struct node *creat(int n,char *a,char *b) { struct node *root; if(n==0) return NULL; else root=new node; int i; root->data=a[0]; for(i=0;i<n;i++) { if(b[i]==a[0])break; } root->lchild=creat(i,a+1,b); //第二次长度变为前面的i root->rchild=creat(n-i-1,a+i+1,b+i+1); return root; }; void f(struct node *root) { queue<struct node*>q; q.push(root); struct node *tmp=new node; while(!q.empty()) { tmp=q.front(); q.pop(); if(tmp) { cout<<tmp->data; q.push(tmp->lchild); q.push(tmp->rchild); } } } int main() { int t; while(cin>>t) { struct node *root; while(t--) { root=new node; cin>>a; cin>>b; int n=strlen(a); root=creat(n,a,b); f(root); cout<<endl; //换行丢了 } } return 0; }//前中建立二叉树,利用stl的queue