一、知识框架
二、课堂疑问解答
1、定义
①typedef struct ②me:typedef struct
{ {
char data; char data;
int parent; int parent;
}Node; }BiTNode;
typedef struct int n;
{ cin >> n;
Node *Tree; BiTNode *BiTree = new BiTNode[n];
int t;//记录根结点
}BiTree;
无论以何种方式遍历,总是从根结点开始,若是用第二种方法,每次时间复杂度都为O(n),而若将根结点所对应的下标值与数组打包成结构体,每次查找根结点的时间复杂度为O(1)
2、该定义正确,且在堆中用new来人工分配空间
若:
int n;
cin >> n;
int a[n];//错误,不合法,在栈中分配空间,C语言中合法,但在C++中不合法
①第2点错误,char data[MAXSIZE]相当于一个char型数组,但是parent只有一个,而题目要求一个data就必须对应一个parent。通常提到的查找指定结点是根据数据元素来找。
②数组中元素存储是从下标0开始,若已知结点对应下标为i,则其双亲结点的下标,若i/2==0,则为0,否则为i/2-1;左孩子为2*n+1,右孩子为2*(n+1),且都小于n-1;
4、
什么都不做,直接退出,返回上一层;若不为空,怎是中序遍历的方式输出该树
5、层次遍历
Queue
总:队列和栈是解决某一问题的工具,具体使用哪一种需要根据实际问题而定,可以查阅STL了解两者所包含的函数方法以及注意事项
6、
不正确,递归定义必须在前面先声明才能使用,否则编译会出错
改正:typedef struct CNode
7、在一根度为3的树T中,若有10 个度为3的结点,一个度为2的结点,10个度为1的结点,则树T的叶子结点个数为多少?
总结点数=分支总数+1 即10*3+2*1+10 + 1 = 43
叶子节点=43-10-1-10 = 22
三、pta作业和实践
1、
一开始有点懵逼,百度查了一下,但还是没理解,所以就借助课本的图来帮助理解,从中也找到了之前忽略的一个知识点,森林转换为二叉树时,对应有“左孩子,有兄弟的”的规律
在最后生成的二叉树中,父子关系在对应森林关系中可能是兄弟关系或原本就是父子关系。
情形Ⅰ:若结点v是结点u的第二个孩子结点,在转换时,结点v就变成结点u第一个孩子的右孩子,符合要求。
情形Ⅱ:结点u和v是兄弟结点的关系,但两者之中还有一个兄弟结点k,则转换后,结点v就变为结点k的右孩子,而结点k则是结点u的右孩子,符合要求。
情形Ⅲ:结点v的父结点是原先的父结点或兄弟结点。若结点u的父结点与v的父结点是兄弟关系,则转换之后,不可能出现结点u是结点v的父结点的父结点。
2、实践树的同构用到的递归算法思路有点乱,去博客上找到了相关编程题,借用了它的算法,还在琢磨中
四、小组合作
1、同样的问题,又忘了释放空间,每次打代码太注重于结果而忽略其他比如优化还有释放空间
2、堆和栈的空间不同,申请数组空间100000的时候,在栈中会报错,而在堆中可以,要注意数组有效元素是从1开始
3、树的创建和定义废了很长时间,更能体会到画图的好处,能帮我们理清思路,写代码的时候就从容不迫
五、不足和遇到的问题
1、有些课程没能及时预习,导致看视频的时候有点手足无措,只好最后再看一遍树再看视频,废了很长时间
2、知识掌握的不牢,打代码的时候总是需要翻翻书回顾书上的代码
3、应用队列的时候,不知道为什么用size函数进入不了循环,最后只能用成了empty函数