浙大数据结构第三周之03-树2 List Leaves

这篇具有很好参考价值的文章主要介绍了浙大数据结构第三周之03-树2 List Leaves。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目详情:

Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in one line all the leaves' indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

Sample Input:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

Sample Output:

4 1 5

简单翻译:

就是给一把二叉树节点,其中要按从左往右,从上往下顺序依次输出所有叶子节点(强调:叶子节点的左右孩子都是空节点)

主要思路:

这题主要思路其实还好,也就是分为两部分,一部分是建树,与上一题一样,另一部分就是层序遍历,不过这里的队列数据结构是用c语言循环队列实现的,如果是特别要求逐层操作,往往考虑层序遍历,层序遍历顺序:

(1)从队列中取出一个元素

(2)访问该元素所指节点

(3)若该元素所指节点左右孩子非空,则将其左右孩子顺序入队

该题另一个要注意的点就是如何控制输出空格,定义了一个全局变量countLeave,先在建树时统计叶子结点数量,层序遍历每打印一个叶子节点就-1,打印最后一个就不会打印多余的空格文章来源地址https://www.toymoban.com/news/detail-564385.html

代码实现:

/*
第一部分:实现队列的数据结构
第二部分:实现读入节点原式数据,用结构体数组保存
第三部分:层序遍历
*/
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 15
#define EMPTY '-'
#define NONE 14
/*实现队列数据结构*/
typedef struct QueueNode Queue;
struct QueueNode {
    int Data[MAX_SIZE];
    int Head, Rear;
    int NodeNum;
};
/*循环队列初始化*/
void Init(Queue* queue) {
    (*queue).Head = 0;
    (*queue).Rear = -1;
    (*queue).NodeNum = 0;
}
/*判断队列有没有满*/
bool IsFull(Queue* queue) {
    if((*queue).NodeNum == MAX_SIZE) return true;
    else return false;
}
/*判断队列是否为空*/
bool IsEmpty(Queue* queue) {
    if((*queue).NodeNum == 0) return true;
    else return false;
}
/*压入队列*/
void Push(Queue* queue, int num) {
    if(IsFull(queue)) return;
    (*queue).Data[++(*queue).Rear % MAX_SIZE] = num;
    (*queue).NodeNum++;
    return;
}
/*弹出队列*/
void Pop(Queue* queue) {
    if(IsEmpty(queue)) return;
    (*queue).Head = ((*queue).Head + 1) % MAX_SIZE;
    (*queue).NodeNum--;
    return;
}
/*返回队列队首元素*/
int Top(Queue* queue) {
    if(IsEmpty(queue)) return NONE;
    return (*queue).Data[(*queue).Head % MAX_SIZE];
}

/*实现读入树*/
typedef struct TreeNode Tree;
struct TreeNode {
    int LeftChild, RightChild;
    bool IsRoot;
};
Tree tree[MAX_SIZE];
int countLeave = 0;
int BuildTree() {
    /*初始化*/
    for(int i = 0; i < MAX_SIZE; i++) tree[i].IsRoot = true;
    int nodeNum;
    scanf("%d", &nodeNum);
    getchar();
    for(int i = 0; i < nodeNum; i++) {
        char tmpLeft, tmpRight;
        scanf("%c %c", &tmpLeft, &tmpRight);
        getchar();
        if(tmpLeft == EMPTY) {
            tree[i].LeftChild = NONE;
        }
        if(tmpLeft >= '0' && tmpLeft <= '9') {
            tree[i].LeftChild = tmpLeft - '0';
        }

        if(tmpRight == EMPTY) {
            tree[i].RightChild = NONE;
        }
        if(tmpRight >= '0' && tmpRight <= '9') {
            tree[i].RightChild = tmpRight - '0';
        }
        
        tree[tree[i].LeftChild].IsRoot = false;
        tree[tree[i].RightChild].IsRoot = false;
    }

    int rootId = NONE;
    for(int i = 0; i < nodeNum; i++) {
        if(tree[i].IsRoot == true) {
            rootId = i;
            break;
        }
    }
    for(int i = 0; i < nodeNum; i++) {
        if(tree[i].LeftChild == NONE && tree[i].RightChild == NONE) countLeave++;
    }
    return rootId;
}
void PrintLeave(int root) {
    Queue queue;
    Init(&queue);
    Push(&queue, root);
    while(!IsEmpty(&queue)) {
        int queueHead = Top(&queue);
        Pop(&queue);
        if(tree[queueHead].LeftChild == NONE && tree[queueHead].RightChild == NONE) {
            if(--countLeave) {
                printf("%d ", queueHead);
            }
            else {
                printf("%d", queueHead);
            }
        }
        if(tree[queueHead].LeftChild != NONE) {
            Push(&queue, tree[queueHead].LeftChild);
        }
        if(tree[queueHead].RightChild != NONE) {
            Push(&queue, tree[queueHead].RightChild);
        }
    }
    return;
}
int main() {
    int root = BuildTree();
    PrintLeave(root);
    return 0;
}

到了这里,关于浙大数据结构第三周之03-树2 List Leaves的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 浙大数据结构第六周之初识图

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0N≤10)和E,分别是图的顶点数和边数。随后E行,每行给

    2024年02月05日
    浏览(34)
  • 浙大数据结构第一周01-复杂度3 二分查找

    本题要求实现二分查找算法。 函数接口定义: 其中 List 结构定义如下: L 是用户传入的一个线性表,其中 ElementType 元素可以通过、==、进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)

    2024年02月12日
    浏览(48)
  • 浙大数据结构第八周之08-图7 公路村村通

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路

    2024年02月11日
    浏览(36)
  • 浙大数据结构第五周之05-树9 Huffman Codes

    In 1953, David A. Huffman published his paper \\\"A Method for the Construction of Minimum-Redundancy Codes\\\", and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encountering a big problem: the Huffman codes are NOT unique. For example, given a string \\\"aaaxuaxz\\\", we can observe th

    2024年02月15日
    浏览(63)
  • 浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月13日
    浏览(51)
  • 浙大数据结构之04-树4 是否同一棵二叉搜索树

    给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜

    2024年02月16日
    浏览(36)
  • (浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

    目录 3.3.1 遍历(先中后) 二叉树的遍历 先序遍历: 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路:使用堆栈 中序遍历的非递归算法具体实现方法为: 3.3.3 层序遍历 难点 解决方法: 队列实现 思路 有如下二叉树作为例子: 遍历过程:(出队即

    2024年02月06日
    浏览(48)
  • 浙大数据结构第四周之04-树6 Complete Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node\\\'s key. The right subtree of a node contains only nodes with keys greater than or equal to the node\\\'s key. Both the left and right subtrees must also be binary search trees. A Comple

    2024年02月16日
    浏览(50)
  • (浙大陈越版)数据结构 第三章 树(中) 二叉搜索树和平衡二叉树

    目录 4.1.1 二叉搜索树及查找 什么是二叉搜索树 定义 二叉搜索树特殊函数集: 查找操作:Find 算法思想 代码实现 补:查找最大和最小元素 4.1.2 二叉搜索树的插入 插入操作:Insert 算法思想 代码实现 例题 4.1.3 二叉搜索树的删除 删除操作:delete 算法思想 情况1:删除叶节点

    2024年02月08日
    浏览(54)
  • 数据结构和算法-2023.07.03

      由于工作量加大,加之每天要写博客的内容上,深度可能没有那么深度了,但是为了保持这个日更的习惯,还是要坚持更新一些,我也发现了,其实写这个博文,更让我从某种程度上我重新的安静下来,重新的去理解和审视之前学习过的知识,之前的薄弱点在哪里,即使在

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包