zoukankan      html  css  js  c++  java
  • DS博客作业05--树

    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) 函数。
    
  • 相关阅读:
    复杂网络常用数据集网站
    01单人决策问题
    《无线网络安全技术》阅读笔记
    最优化理论基础
    测试layer控件,除了ie报错其它浏览器都生效
    Native App、Web App、Hybrid App
    有些效果在IE下运行时,IE下开调试模式才显示正常是什么原因?
    关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法
    js表单提交的三种方式
    前端涉及的所有知识体系
  • 原文地址:https://www.cnblogs.com/20000519yxn/p/10888122.html
Copyright © 2011-2022 走看看