第五章小结

这一章我先来讲一下我实践第二题的思路

先是基本结构体

typedef struct{
    int doors;//门的数量 
     int *p;//p指向具体门的编号,把p看作是一个整型数组 
 }node;

再是主要函数

int main(){
    node *a;
    int i,j,k,root;
    root = input(a);
    cout<< find(a,root)<<endl;
    return 0;
}

然后处理输入的数字

int input(node *&a)
{
    int n,x,i,j;
    bool *vi;
    cin>>n;
    a=new node[n+1];
    vi=new bool[n+1];
    for(i=1;i<=n;++i)
    vi[i]=false;
    
    for(i=1;i<=n;++i)
    {
        cin>>x;
    a[i].doors=x;
    a[i].p = new int[x];
    for(j=0;j<x;++j){
    
    cin>>a[i].p[j];
    vi[a[i].p[j]]=true;
    }
}
//找出根在a数组的下标 
for(i=1;i<=n;++i)
if(!vi[i])break;
return i;
}

然后再查找出最末尾的叶子结点

int find(node *a, int root)
{
    //从a数组的下标开始,往下搜索
    queue<int>q;//定义用于待访问的门编号的队列
    //根编号入队
    q.push(root);
    int x,i;
    //当队列不为空
    //x=出队
    //x后面的门编号入队
    while(!q.empty()){
        x=q.front ();
        q.pop();
        for(i=0;i<a[x].doors;++i)
        q.push(a[x].p[i]);
    } 
    return x;
}

在解决这道题的时候,我有一个地方老是错误一开始我并没有觉得我的代码哪里有错,但是再请教了班里的其他同学之后,发现是一个很小很小的错误,主要是自己过于粗心,j的范围是小于x,而不是小于等于x,把这里改了之后,所有的测试点就都对了。

整个第五章主要讲树。

树的遍历主要分为

1、先序遍历(根,左孩子,右孩子)

2、中序遍历(左孩子,根,右孩子)

3、后序遍历(左孩子,右孩子,根)

树的存储则可以分为结构、顺序存储、链式存储三个部分来说,结构又可分为双亲、孩子、孩子兄弟三种表示法。

另外在这一章的最后,我们还学习了哈夫曼树。

 

对于自己的目标,就是在处理代码时不够精致,有点粗心,代码的结构还不够精简。

简单来说,就是多看,多打,少休息。

 

posted @ 2019-05-04 22:13  Lnnnnᐛ  阅读(119)  评论(3编辑  收藏  举报