第五章内容小结

在第五章,我们学习了树这个数据结构,并且学习了其定义、遍历等操作,最后还学习了哈夫曼树。

一.树的遍历

树的遍历操作有以下三种:

1。先序遍历(根,左孩子,右孩子)

void PreOrderTravel(node t[], int x)
{
    cout << t[x].name << " ";
    if(t[x].lch!=-1) PreOrderTravel(t, t[x].lch);
    if(t[x].rch!=-1) PreOrderTravel(t, t[x].rch);
}

2。中序遍历(左孩子,根,右孩子)

void InOrderTravel(node t[], int x)
{
    if(t[x].lch!=-1) InOrderTravel(t, t[x].lch);
    cout << t[x].name << " ";
    if(t[x].rch!=-1) InOrderTravel(t, t[x].rch);
}

3。后序遍历(左孩子,右孩子,根)

void PostOrderTravel(node t[], int x)
{
    if(t[x].lch!=-1) PostOrderTravel(t, t[x].lch);
    if(t[x].rch!=-1) PostOrderTravel(t, t[x].rch);
    cout << t[x].name << " ";
}

二.实践遇到的问题。

针对“深入虎穴”这道编程题,看到输入格式的时候一开始有点懵,不知道怎么将这样的输入方式与树这个数据结构相契合。

但后来在老师带领下,明白了这个输入格式所对应的逻辑图。

然后建立结点。

typedef struct{
    int doors;//门的数量
     int *p;//p指向门的编号,将p看作是整型数组
 }node;

然后主函数。

int main(){
    node *a;
    int i,j,k,root;
    root = input(a);
    cout<< find(a,root)<<endl;
    return 0;
}

输入和寻找是最大的问题,一开始在find函数中还把循环里的i<a[x]写成了i<=a[x],导致溢出,无论怎样测试都不对

int input(node *&a)
{
    int n,i,x,j;
    bool *vi;
    cin>>n;
    a = new node[n+1];//为a数组申请空间。
    vi= new bool[n+1];
    for(i=1;i<=n;i++)
    {//初始化vi为false
        vi[i]=false;
    }

    for(i=1;i<=n;++i)
    {
        cin>> x;
        a[i].doors=x;
        a[i].p=new int[x];
        for(j=0;j<x;++j)//new的空间为x,x的有效下标为0~x—1,故循环从0开始。
        {
            cin>>a[i].p[j];
            vi[a[i].p[j]]=true;

        }
    }
    //找出根在数组的下标
    for(i=1;i<=n;++i)
    {
        if(!vi[i])break;
    }
    return i;
}

int find(node *a,int root)
{
    //从a数组的下标向下搜索
    queue<int>q;//定义用于待访问的门编号的队列。
    //根编号入队
    q.push(root);
    int x,i;

    //当队列不为空
    //x = 出队
    //x后的门编号入队
    while(!q.empty()){
        x=q.front();
        q.pop();
        for(i=0 ; i<a[x].doors;++i)
        {
            q.push(a[x].p[i]);
        }
    }
    //答案为x
    return x;

}

做完这道题以后,就觉得自己分析问题不够清晰,思路有些混乱,然后做题过程中十分粗心、大意。

还需要多多练习,多敲代码,继续整理笔记,理清思路。

原文地址:https://www.cnblogs.com/DreamGCdog/p/10810464.html

时间: 2024-10-09 04:48:26

第五章内容小结的相关文章

第三章内容小结

1.内容小结:在第三章的学习中我们学习到了两种特殊的线性表:栈和队列. (1)特殊性:栈:限定仅在表尾(栈顶)进行插入或者删除的线性表,后进先出. 队列:只允许在表的一端进行插入(队尾),而在另一端(队头)进行删除的线性表.先进先出. (2)存储方式:顺序存储(顺序栈:循环队列)和链式存储(链栈:链队). (3)主要操作: 栈:入栈和出栈.对于顺序栈的入栈和出栈操作前要判断栈满或栈空. 队列:入队和出队.对于顺序队的循环队列进队和出队操作要判断队满或队空.涉及队头或队尾指针的修改都要将其对MAX

第五章学习小结

---恢复内容开始--- 第五章主要学习的是树与二叉树,有利用数组进行存储的顺序二叉树,也有利用链表进行存储的链式二叉树,在这个基础上又展开了二叉树的遍历. 二叉树的遍历分为前序遍历,中序遍历以及后序遍历,主要区别在于遍历的顺序不同. 前序遍历: (1)访问根结点. (2)前序遍历左子树. (3)前序遍历右子树 . 中序遍历: (1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树 后序遍历: 1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点 对于二叉树树的遍历的应用: 给定两棵

第四章内容小结

1.串的学习: 1)对串的操作有在串中查找某个子串,求取一个子串,在串的某个位置插入一个子串,删除一个子串等: 2)串的存储结构分为串的顺序存储.串的链式存储:若多用插入及删除操作则使用链式存储更方便: 3)串的模式匹配算法分为BF算法和KMP算法,BF算法的匹配过程易于理解,但是该算法在最好情况下的平均时间复杂度为O(n+m),最坏情况下的平均时间复杂度为O(nxm),算法的时间复杂度较高.KMP算法较为复杂一点,但它可在O(m+n)的时间数量级上完成串的模式匹配操作,KMP算法最大的特点是指

第五章随笔小结

第五章是大名鼎鼎的树,学的怎么说呢... 原理不难,操作啊,遍历啊,查找删除啥的也都基本掌握了.就感觉现在思维很难拓展发散开,像哈夫曼树感觉真是太神奇了. 还是先捋一下学了啥吧 首先存储还是借助线性工具来存储这种非线性的东西,主要通过数组下标啊,链表啊某种逻辑来实现树结点之间的链接.一般有1.双亲表示法2.孩子表示法3.孩子兄弟法...当然兵无常势,水无常形,表示法还有很多,需要自己在解决问题过程中选择合理的方法 然后遍历则有先.中.后.层次遍历四种遍历 先 void PreOrderTrave

第二章内容小结

本章以线性表的定义和特点为切入点,对顺序表和链表的初始化,取值,查找,插入,删除等相关操作进行详细的介绍.对线性表顺序存储和链式存储的相对于各种操作的效率.优缺点以及时间复杂度进行了详细的比较.而顺序表一般可用数组进行表示,若要进行随机查找操作用顺序表更好,若有大量的插入删除操作则选择可用指针表示的链表进行存储更好.在这章我们也明白了元素在顺序表和链表中的存储方式. 最开始在本章学习中我比较多的是懂得了具体的存储方式和结构,编程能力却仍比较弱,懂得如何进行却总打出错误代码,后来就是要反复地看数据

UNIX 网络编程第五章读后有感

刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: 1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <stdio.h> 4 #include <error.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <s

[Java Concurrency in Practice]二至五章小结

下面这个"并发技巧清单"列举了在第一部分(二至五章)中介绍的主要概念和规则. 可变状态是至关重要的(It's the mutable state,stupid). 所有的并发问题都可以归结为如何协调对并发状态的访问.可变状态越少,就越容易确保线程安全性. 尽量将域声明为final类型,除非需要它们是可变的. 不可变对象一定是线程安全的. 不可变对象能极大地降低并发编程的复杂性.它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制. 封装有助于管理复杂性. 在编写线程安全的

Python基础教程(第五章 条件、循环和其他语句)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5329066.html______ Created on Xu Hoo 读者学到这里估计都有点不耐烦了.好吧,这些数据结构什么的看起来都挺好,但还是没法用它们做什么事,对吧? 下面开始,进度会慢慢加快.前面已经介绍过了几种基本语句(print语句.import语句.赋值语句).在深入介绍条件语句和循环语句之前,我们先来看看这几种基

DS第4章学习小结

你对本章内容的小结 完成作业或实践时解决困难的经验分享 这段时间,你参考了哪些值得向大家分享的资料?每一项推荐都请说明推荐理由及列出相关链接(或书目名称,具体页码) 目前学习过程中存在的困难,待解决或待改进的问题 上次博客确定的目标达到了吗?如果没达到,请分析原因 接下来的目标 一.你对本章内容的小结 第4章主要学习了串.数组 串主要学习了有关 模式匹配算法 的两种算法:T(n)=O(m*n)的BF算法 和 T(n)=O(m+n)的KMP算法, KMP算法难在求出 模式的next数组.(即求ne