Data_Structure 树

学习总结

1思维导图


2 树结构学习体会

树作为非线性结构,相比之前的线性结构要复杂一点,最重要的就是递归的调用。在做树的PTA时,
我遇到的问题有:递归建树不是很熟练,得借助模板;还是不会用树求表达式值;中序后序遍历还是有点模糊;树的线索化也不是很懂,代码就更不会了。
我解决的问题有:根据先序中序遍历确定唯一二叉树及后序遍历;给定一堆数字建立哈夫曼树;求叶节点带权长度.

PTA实验作业

1 题目1:6-1 jmu-ds-二叉树操作集

设计思路(伪代码或流程图)

PTA提交列表说明


看书上的代码打的,没遇到太大问题。

题目2:6-4 jmu-ds-表达式树(必做)

这题我是真不会。。。。

题目3:7-7 修理牧场

设计思路(伪代码或流程图)

代码截图



PTA提交列表说明。


这题因为书上有建树和递归遍历代码,所以我只需写选最小值的代码,然后还在DEVC上试了有点时间通过后提交就直接过了。

截图本周题目集的PTA最后排名

本次题目集总分:285分

必做题共:230分

PTA排名截图

我的总分:2分

阅读代码(必做)

题目:PTA 7-7家谱处理

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct Node{
string name;
int parent;
int num;
}t[105];
int n;
int find(char *a)
{
// printf("a = %s\n",a);
for(int i=0;i<=n;i++)
{
// cout<<"t[i] = "<<t[i].name<<endl;
if(t[i].name==a)
{
// printf("sssssss\n");
// printf("i = %d\n",i);
return i;
}
}
return -1;
}
int Trace(int child)
{
for(int i=child-1;i>=0;i--)
{
if(t[i].num<t[child].num)
return i;
}
return -1;
}
int CheckParent(int c,int p)
{
// printf("t = %d\n",Trace(c));
if(Trace(c)==p)return 1;
else return 0;
}
int CheckAncestor(int c,int an)
{
while(c!=-1)
{
if(CheckParent(c,an))return 1;
else c=Trace(c);
}
return 0;
}
int CheckSibling(int c1,int c2)
{
if(Trace(c1)==Trace(c2))return 1;
else return 0;
}
void pipei()
{
int x,y,res=0;
char a[15],b[15],c[15],d[15];
scanf("%s %s %s %s %s %s",a,d,d,c,d,b);
// printf("%s %s %s\n",a,b,c);
x=find(a);
// printf("x = %d\n",x);
y=find(b);
// printf("y = %d\n",y);
switch(c[0])
{
case 'c':res=CheckParent(x,y);break;
case 'p':res=CheckParent(y,x);break;
case 's':res=CheckSibling(x,y);break;
case 'd':res=CheckAncestor(x,y);break;
case 'a':res=CheckAncestor(y,x);break;
}
if(res)printf("True\n");
else printf("False\n");
}
int main()
{
int m,i,j,len;
string s;
char a[15],b[15],c[15];
scanf("%d%d",&n,&m);
getchar();
t[0].parent=-1;
for(i=1;i<=n;i++)
{
getline(cin,s);
// cout<<s<<endl;
len=s.size();
t[i].num=0;
t[i].parent=i;
j=0;
while(s[j]==' ')
{
t[i].num++;
j++;
}
t[i].name=s.substr(t[i].num,len);
}
// for(i=1;i<=n;i++)
// cout<<"name"<<t[i].name<<endl;

// char x[15];
// scanf("%s",x);
for(i=1;i<=m;i++)
{
pipei();
if(i<m)
getchar();
}
}

/要注意:1.只有同一个parent的才能叫sibling;
2.从该名字往前找到第一个空格比他少的名字就是他的parent;
3.Ancestor必须是parent的parent的……parent,
而不仅仅是空格比他少就行。
/

链接地址:[链接戳这里](https://gitee.com/QueGuangRenChen/data_structure/blob/master/chpt04/家谱处理.cpp)

Git提交记录截图

posted @ 2018-05-05 20:46  余景胜  阅读(278)  评论(0编辑  收藏  举报