【第五章】学习小结

本章我们学习了数据结构的一种——树。

相比于前面的内容来说,树的构造更为抽象、难懂,也是我们所接触的第一种非线性数据结构。

**前序遍历

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);
}

中序遍历

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);
}

后序遍历

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 << " ";
}

本章的例题要求掌握树的运用。

给定一棵树,你应该按照从上到下,从左到右的顺序列出所有的叶子。

每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数n(≤10),它是树中节

点的总数,因此节点的编号从0到n−1。接下来是n行,每行对应一个节点,并给出节点左、右子

级的索引。如果该子项不存在,则将在该位置放置一个“-”。任何一对孩子都被一个空间隔开。

对于每个测试用例,按从上到下和从左到右的顺序在一行中打印所有叶的索引。任何相邻的数字之

间必须正好有一个空格,并且行尾没有多余的空格。

本题对于给定的一个树结构,要求输出其叶子结点的序号。

#include "pch.h"
#include <iostream>
#include <queue>
using namespace std;
typedef struct {
    int lch;
    int rch;
}TrNode;
int buildtree(TrNode T[], int n);
void output(TrNode T[],int x,int n);
int main()
{
    TrNode ch[10];
    int x, n;
    cin >> n;
    x = buildtree(ch,n);
    output(ch, x, n);
    return 0;
}
int buildtree(TrNode T[], int n)
{
    bool check[10] = { false };
    char x, y;
    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        if (x != ‘-‘) {
            T[i].lch = x-‘0‘;
            check[T[i].lch] = true;
        }
        else T[i].lch = -1;

        if (y != ‘-‘)
        {
            T[i].rch = y-‘0‘;
            check[T[i].rch] = true;
        }
        else T[i].rch = -1;

    }
    for (int i = 0; i < n; i++) {
        if (!check[i]) return i;
    }

}
void output(TrNode T[], int x,int n)
{
    int tmp;
    queue<int> q;
    q.push(x);
    int flag = 0;
    while (!q.empty()) {
        tmp = q.front();
        q.pop();
        if (tmp != -1) {
            q.push(T[tmp].lch);
            q.push(T[tmp].rch);
            if (T[tmp].lch == -1 && T[tmp].rch == -1) {
                if (flag != 0) cout << " ";
                flag = 1;
                cout << tmp;
            }

        }
    }
}

原文地址:https://www.cnblogs.com/kirigirikyoko/p/10810527.html

时间: 2024-10-28 20:57:22

【第五章】学习小结的相关文章

第五章学习小结

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

第三章学习小结—-转

[学习目标] 01掌握一维数组的声明和使用方法(OK) 02掌握二维数组的声明和使用方法(OK) 03掌握字符串的声明.赋值.比较和连接方法(连接很少用) 04熟悉字符的ASCII码和ctype.h中的字符函数 05正确认识++.+=等能修改变量的运算符(OK) 06学会用编译选项-Wall获得更多的警告信息(OK) 07了解不同操作系统中换行符的表示方法(嗯) 08掌握fgetc和getchar的使用方法(fgetc基本没用过) 09掌握预处理和迭代开发的技巧(嗯) 程序3-1 逆序输出 输入

数据结构 第一章学习小结

数据结构   第一章学习小结 1.数据结构第1章的心得体会: 这周学习了数据结构的绪论及第一章.初步了解了数据结构与算法的相关概念,一开始看书看视频时觉得还挺抽象的,不能够完全理解.但是反复多看了几遍之后,结合例题,自己去操作去跑代码,慢慢觉得容易理解接受起来了.由于现在以网课形式进行教学,老师上课的同时基本还是靠自己去理解学习.当然老师也发挥很大的作用,比如让我们更深入的了解递归的空间复杂度为什么与问题规模有关,又怎样去找到该函数的临界值等等.既锻炼了我们深入思考的能力,也让我们更加清楚了解不

第5章学习小结

第五章主要学习了树的知识,以前一直很好奇,为什么电脑能存储像树一样的数据结构,学完才发现,ADT加数组或者ADT加链表真的可以衍生出多种多样的数据类型,以下做出本章小结: 1.利用ASCII码实现不同类型的数据的转换,如:int = char - ‘0’. 2.学会了利用bool类型标记找出所需数据类型,如找根节点,先将bool型数组初始化成false,输入过的节点标记为true,那么为false的即为根节点. 3.树的四种遍历方式:利用递归实现三种遍历方式 先序: void PreOrderT

安卓权威编程指南 - 第五章学习笔记(两个Activity)

学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 题目:ActivityA登录界面(用户名.密码.登陆按钮),ActivityB(Edit,返回按键:SubmitButton).A界面输入用户名和密码传到B中,B验证用户输入的用户名和密码,如果错误就返回A,并用Toast 显示用户名和密码错误:如果正确,就在第二个 activity中显示一个Edi

构建之法第五章学习

今天我学习了<构建之法>第五章 团队和流程.首先我了解了写了再改模式(Code-and-Fix) 史蒂夫·迈克康奈尔(Steve McConnell)在这里提到了不少开发流程.第一个提到的开发流程.这个流程也有好处,不需要太多其他准备或相关知识,大家上来就写代码,也许就能写出来,写不出来就改,也许能改好.当面临下面的任务时,也许这个方法是有用的.但是,要写一个有实际用户.解决实际需求的软件,这个方法的缺点就太大了. 然后我学习了瀑布模型 当软件行业还在年幼的时期,它从别的成熟行业(硬件设计,建

《构建之法》第三、四、五章学习总结

第三章讲的是关于如何成为一名合格甚至优秀的软件工程师.第一节主要讲的是个人能力的发展与团队合作的关系:第二节讲的则是关于软件工程师的职业发展:最后一节通过用魔方举例向我们讲述了怎样提升自己的技能. 第四章讲的是关于软件开发时两个人该怎样合作.这一章的前三节讲的都是关于代码规范,包括风格规范和设计规范:第四节讲的是关于代码复审时的问题,代码复审的正确定义是看代码是否在"代码规范"的框架内正确地解决了问题:第五节讲的是结对编程 :第六节介绍了两人合作的不同阶段和需要了解的相关技巧. 第五章

第五章内容小结

在第五章,我们学习了树这个数据结构,并且学习了其定义.遍历等操作,最后还学习了哈夫曼树. 一.树的遍历 树的遍历操作有以下三种: 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]

《Linux内核设计与实现》第五章学习笔记

第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限的访问硬件设备,提供了新进程与已有进程进行通信的机制,也提供了申请操作系统其他资源的能力.提供接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行. 课堂知识点回顾 1. 系统调用:需要int 0x80模拟中断让硬件触发.同步.主动地进入系统空间. 2. 硬中断:异步.被动地进入系统空间.CPU运行时发生错误则中断,中断后没有进程调度. 3. 软中断:中断后还执行其他进程调度. 4. 系统调用过程:

Thinking In Java第五章学习笔记

第五章:初始化与清理 初始化和清理是涉及程序安全的两个问题.Java构造器用于新建对象时的初始化,而垃圾回收器则进行清理. 构造器的名称必须与类名一样,虽然构造器是一种特殊的方法,但是每个方法首字母小写的编码风格并不适合用于构造器. 构造器是没有返回值的,但是new表达式却返回了对新建对象的引用. 方法重载是构造器所必须的.每个重载方法都必须独一无二的参数列表.甚至参数顺序的不同,也足以区分两个方法.不过一般不建议这么做,因为这会使代码难以维护.当传入的数据类型小于方法中声明的形式参数类型,实际