1.本周学习总结
1.思维导图
2.学习体会
最近一段时间学了我觉得很难的树,这章的课本从介绍树的概念开始,比如树的节点高度兄弟孩子啊等等,本来有些不明白的我,做了课堂派和看了老师的课对于概念有了一定的理解,但是代码方面还是不太会。首先树表示数据表素之间一对多的关系,可以分为二叉树(完全二叉树、满二叉树、平衡二叉树、排序二叉树),红黑树,哈夫曼树等等,遍历的顺序也有很多种:中序遍历,先序遍历、后序遍历、层次遍历等等(每一种我们都要掌握),分类较多,应用的范围也很广。树最大的优点是进行储存查询,所以经常应用于表达式求解,单词查找,目录树,通讯录等,非常方便。同时,通过最近一阵的学习,一边写树的代码,一边又用到递归,加深了理解。
2.PTA实验作业
2.1题目一:还原二叉树
2.1.1设计思路(伪代码)
CreatBt(char *pre,char *in,int n)
{
n=0时返回0;
申请一棵树的空间;
int mid;
for(int i从0到n)
{
如果in[i]==pre[0]
mid=i;
break;
}
BT->data=pre[0];
用到递归算法:
左孩子=CreatBt(pre+1,in,mid);
右孩子=CreatBt(pre+mid+1,in+mid+1,n-1-mid);
}
Gethigh(BinTree BT)
{
如果树不为空,返回0;
求左孩子和右孩子的高度;
返回 lefth>righth?lefth+1:righth+1;
}
2.1.2代码截图
2.1.3提交列表及说明
Q1:编译错误?
A1:用到递归算法时,对于递归并不熟练,总是出错。
Q2:编译错误?
A2:对于如何遍历树,什么顺序分别怎么弄也不熟练。
2.2题目二:二叉树层次遍历
2.2.1设计思路(伪代码)
建树代码CreatBt(string str,int i)
{
如果i大于len-1, 返回;
遇到“#” 返回;
设指针以及为树申请内存空间;
BT->data=str[i];
左孩子=CreatBt(str,2*i);
右孩子=CreatBt(str,2*i+1);
返回树;
}
打印树
Print(BinTree BT)
{
queue<BinTree> q;
遍历树,
入队;
设指针curNode,lastNode;
curNode=lastNode=BT;
当队不为空
{
curNode等于队首;
如果 curNode->lchild
{
将当前结点的左孩子入队 }
如果 curNode->rchild
{
将当前结点的右孩子入队
}
如果flag==1
输出data并置flag=0;
否则
输出data;
如果curNode等于lastNode
lastNode等于现在结点的右孩子;
出队;
}
2.2.2代码截图
2.2.3提交列表及说明
Q1:编译错误?
A1:我不是很会层次遍历。然后看了看书,明白层次遍历是对某个结点访问之后,在按照他左右孩子的顺序进行同样的处理,一层一层访问,与队列的特征一致。然后经过舍友的教导,有了一定的思路,但依旧产生了许多错误。
O3:最后改好了所有错误,但是还是编译错误,然后我提交了一次又一次,也不知道怎么错了嘤嘤嘤
A3:傻傻的我忘记改编译器,应该改成C++啊!
2.3题目三:目录树
2.3.1设计思路(伪代码)
Read()
{
定义字符型数组FileName[261]和word[261];
定义指针 temp = &Head;
定义整型j, L = 0;
for ( i从 0到strlen(FileName)
{
如果FileName[i] == '\' {
for (j从L到 i) {
使words[j - L] = FileName[j];
}
words[j - L] = ' ';
temp->Mulu 等于 InsertMulu(temp->Mulu, words);
temp 等于 temp->Mulu;
while (strcmp(temp->Name, words))temp = temp->Brother;
L = i + 1;
}
}
if (L 小于 strlen(FileName)) {
for (j 从 L到 strlen(FileName)) {
words[j - L] = FileName[j];
}
temp->File = InsertFile(temp->File, words);
}
}
}
Node New(char*K) {
给temp 和 temp->Name 申请内存空间;
字符串复制函数(temp->Name, K);
temp->Brother等于空;
temp->File等于空;
temp->Mulu等于空;
使temp->isMulu 等于1;
返回 temp;
}
打印函数
2.3.2代码截图
2.3.3提交列表及说明
Q1:编译错误?
A1:题目好长毫无思路,就总是编译错误。
Q2:编译错误?
A2:在各个函数中都会有一些不太懂得地方,比如简单的打印函数,在使用递归时,Space加几就经常会搞混。
O3:部分正确?
A3:我最大N的地方不太多,后来改了下循环条件,编译就过了,当然寻求了大佬。
3.阅读代码
3.1题目
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:
1
/
2 3
/ /
4 2 4
/
4
下面是两个重复的子树:
2
/ 和 4
4
因此,你需要以列表的形式返回上述重复子树的根结点。
3.2解题思路
将二叉树进行序列化,把整个树的结构进行编号,存在map里,将树变成一个字符串的序列,将根节点的指针变成int型存在vector里,用vector查map。直接进行比较,
从当前结点值开始,按结点值,空段,左子树,右子树的顺序一次比较是否相同。
3.3代码截图
3.4学习体会
对于二叉树,二叉树的序列化,哈希数组和查找又有了一定程度的了解,本题采用将二叉树序列化的形式,建立哈希表,统计每次出现的次数,添加到结果集当中。而哈希表是:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
比如给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。