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] = '\0';
                     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) 函数。