数据结构:第五章学习小结

第五章——树和二叉树(Tree)

一、内容小括

1.树是一种“一对多”的非线性结构,而且有且仅有一个根结点。以及根的子树(SubTree)分为左子树和右子树。同时树也包括“空树”或只有根结点的树。

2.树的常用结构术语:

①结点:树中的一个独立单元;           ②结点的度:结点所拥有的子树数。

③树的度:取树内各结点度的最大值; ④叶子结点:度为0的结点;

⑤双亲(parent)和孩子(child):结点子树根称为该结点的孩子,相应的,该结点称为孩子的双亲。

⑥树的深度:树中结点的最大层次。

⑦二叉树:子树有明确左右之分,次序不能颠倒。

⑧满二叉树和完全二叉树的区别:满二叉树的每一层上的结点数都是最大结点数(2^(i-1)),完全二叉树只需要每一层与满二叉树对应结点编号相同即可(顾名思义“不满”也可)。

二、习题或作业中的实践心得

Point 1.遍历树的次序:分为层次遍历(LevelOrder)、先序遍历(PreOrder)、中序遍历(InOrder)、后序遍历(PostOrder)。

p.s.之前的限时测试把层次遍历和先序遍历记混了,后来默默查了书,发现:层次遍历是“从上到下,从左至右”,先序遍历虽然顺序很像,但是先序是会先将遍历到的那个结点的左右孩子遍历完,再继续往右或者往下遍历。

树使用了递归函数的方法,例中序遍历:

 

void InOrderTraversal(BiTree T)
{//中序遍历 
    if(T)
    {
        InOrderTraversal(T->lchild);
        cout << T->data;
        InOrderTraversal(T->rchild);
    } 
}

 

其中我不小心忘记的步骤就是树申请的结点是需要释放空间的:

void Destroy(BiTree &T)
{
    if(T==NULL) return;//空树就返回
    
    Destroy(T->lchild);//释放左子树空间
    Destroy(T->rchild);//释放右子树空间
    delete T;//释放根结点空间 
}

p.s按着老师的视频思路跟着打,慢慢就会发现开始感觉陌生的“树“”写起代码来没有想象中的复杂,只是使用什么样的遍历方法需要先在书上好好了解~

三、目标完成情况

上周的任务自己尝试了在打完一遍老师的“带你打代码”的两道题后,自己在空闲时间尝试复现了一次。虽然有时候卡在关键算法,会希望再看一下原代码,不过这让我对这个算法记忆跟理解更加深刻一些。同时,即使会惭愧自己在一些限时训练和分组任务上的不足,但还是希望自己脚踏实地地知错就改,慢慢在学习中改进成长!

接下来的目标:第六章的图也是虽然接触过,但以代码的方式还是会有些陌生。希望自己认真跟着课程进度进行学习,如果不会的也可以查询资源或者与同学老师讨论,以及更需要坚持的就是多打代码,学会耐心debug!

 

 

 

posted @ 2020-05-25 21:00  软件工程1902贺依  阅读(204)  评论(0编辑  收藏  举报