2022/4/3 周总结及比赛心得

前言:能明显感觉自己仍未从填鸭式教学脱离,没有养成看资料自我学习的习惯。本周强迫自己阅读了四十多篇资料,其中包括了系统的stl总结、bfs讲解、bfs好题精讲、二叉树的讲解、以及部分思维题目。在下周的学习过程中,仍需重温本周阅读的部分文章。


二叉树

首先二叉树是一种特殊的树,每一次的分叉不超过两部分,它表示的一种递进、传递关系的数据关系。它由有限个,并且每个度都不大于二的结点组成,并且严格分左树与右树。由于在定义二叉树时一般使用链表定义,而在链表中的结点只有一个指针域。与链表不同的是,在储存二叉树的过程中,可以利用两个指针域来分别表示左树与右树。至于其具体表示,与链表高度相似。

创建一个结点的类,类包含有数据域与两个分别指向儿子结点的指针

struct node
{
    char a;//结点数据类型
    node *rch;//右指针
    node *lch;//左指针
};

这里就创建了一个char 数据类型的结点。


如何创建二叉树,实际上就是通过新建结点,将这些结点插入,这其中运用了递归的思想。在代码实现过程中,我遇到的最大的难点是如何将新建的结点中的指针域成功的指向下一个儿子结点。实际上最终实现是通过传递指针地址后判断该地址是否为NULL,若是则开辟一个结点并以此类推这种方式来实现二叉树的构建。

#include <bits/stdc++.h>
using namespace std;

struct node
{
    char a;
    node *rch;
    node *lch;
};

void build(node* &t)
{
    char data;
    cout<<"input a number: ";
    cin>>data;
    if(data=='$')
    return ;
    if(t==NULL)
    {
        t=(node*)malloc(sizeof(node));//malloc函数给指针t开辟一个node类型的空间
        t->a=data;//将输入的data分配给数据域
        t->lch=t->rch=NULL;
    }
    build(t->lch);//通过递归来实现给下一个结点分配空间或者停止递归
    build(t->rch);
}

int main()
{
    node *p=NULL;
    build(p);
}

学会创建二叉树后,对于二叉树的遍历:

先序遍历,实际上就是通过递归先访问左子树,再递归访问右子树,其中递归访问就类似于深度搜索,

void xian(node* t)
{
    if(t!=0)
    {
        cout<<t->a<<"--->";
        xian(t->lch);
        xian(t->rch);
    }
}
Last login: Sun Apr  3 19:35:15 on ttys001

input a number: 1
input a number: 2
input a number: 3
input a number: 2
input a number: $
input a number: $
input a number: $
input a number: $
input a number: $


1--->2--->3--->2--->%                                                           i@HUAWEI-MateBook-X-Pro ~ % 

对于中序实际上只是将访问结点放在访问左树与访问右树中间 。后序就是先左树后右树最后中间。至于层序遍历,似乎与广度搜索很像可以用广度优先搜索为模版将代码呈现。



总结:本周学习着重学习了二叉树的概念、遍历等等,但是这都是基础内容,对于如何使用这种数据结构去解决实际问题我还所知深浅。至于深搜以及广搜,我在阅读了一些博主分享的优质好题后也有了更深的了解。

另一方面,本周的codeforces竞赛过程中,最终只勉强ac了两道题。但其实再多点时间problemD也是又可能ac的,英文阅读理解的偏差会有影响到我对题目的理解,但这背后不仅仅是英文阅读不适应的问题,而是在做题过程中,我总是将问题复杂化,这种复杂化并不能优化代码的运行效率或是其他而仅只将问题考虑的过于困难,这就局限了我的思维。并且,现在的我在有思路之后代码呈现的速度也很慢,这就导致出题速度慢上加满。

对于周日中午的哈工大比赛,我因为代码规范问题出了很多问题,而对于ACM来说,对代码输入、输出格式要求都比较严格,要考虑输入多组的实验数据在写代码的时候也更需注意使用while循环进行输入等等。

综上,算法之路漫漫,在接下来的一周更要广泛阅读优秀博主的文章,规范自己的代码,将思维打开,希望在接下来的比赛能ac更多的问题吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值