基础实验4-2.6 目录树 (30分)- 建树+先序遍历

解题思路:采用将多叉树转化为二叉树的方法(即利用孩子兄弟的结点结构)建立二叉树,最后再先序遍历输出即可

#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct TNode {
    int space;//记录打印空格数
    int prior;//标记是文件还是目录,文件优先级0,目录优先级1(优先级大的优先)
    char name[261];//文件名
    struct TNode *son,*sib;//孩子、兄弟结点指针
};
int IsChar(char c) {//判断是否是英文字母
    if((c>=‘a‘&&c<=‘z‘)||(c>=‘A‘&&c<=‘Z‘))
        return 1;
    return 0;
}
int cmp(struct TNode *p,struct TNode *q) {//先按优先级比较优先级,优先级相等再按字典序比较
    if(p->prior>q->prior)
        return 1;
    if(p->prior==q->prior) {
        if(strcmp(p->name,q->name)<0)
            return 1;
        if(strcmp(p->name,q->name)==0)
            return -1;
    }
    return 0;
}
void Out(struct TNode *root) {//输出打印
    int i;
    if(root) {
        for(i=0; i<root->space; i++) {
            printf(" ");
        }
        printf("%s\n",root->name);
        Out(root->son);
        Out(root->sib);
    }

}
struct TNode *NewNode(struct TNode *root,char *name,int prior) {//新结点
    struct TNode *node;
    node=(struct TNode *)malloc(sizeof(struct TNode));
    strcpy(node->name,name);
    node->sib=node->son=NULL;
    node->prior=prior;
    node->space=root->space+2;
    return node;

}
struct TNode *Add(struct TNode *root,char *name,int prior) {//插入结点
    struct TNode *p=root;
    struct TNode *node=NewNode(root,name,prior);
    if(p->son==NULL) {
        p->son=node;
        return p->son;
    } else {
        if(cmp(node,p->son)==1) {//前插
            node->sib=p->son;
            p->son=node;
            return p->son;
        } else if(cmp(node,p->son)==-1) {//结点相同,返回结点位置即可
            return p->son;
        } else {//同一层则往兄弟结点找
            p=p->son;
            while(p->sib) {
                if(cmp(node,p->sib)==1) {//前插
                    node->sib=p->sib;
                    p->sib=node;
                    return p->sib;
                } else if(cmp(node,p->sib)==-1) {//结点相同,返回结点位置即可
                    return p->sib;
                }
                p=p->sib;
            }
            if(!p->sib) {//找到末尾插入即可
                p->sib=node;
                return p->sib;
            }
        }
    }

}
int main() {
    struct TNode *root=(struct TNode *)malloc(sizeof(struct TNode));
    root->sib=root->son=NULL;
    root->space=0;
    root->prior=1;
    strcpy(root->name,"root");
    char input[261];
    int n;
    scanf("%d",&n);
    int i;
    for(i=0; i<n; i++) {
        scanf("%s",input);
        int j,k=0,prior=0;
        char name[261];
        struct TNode *p=root;
        for(j=0; input[j]!=‘\0‘; j++) {
            if(IsChar(input[j]))
                name[k++]=input[j];
            else if(input[j]==‘\\‘) {
                name[k]=‘\0‘;
                prior=1;
                p=Add(p,name,prior);
                k=0;
            }
        }
        if(input[j]==‘\0‘&&IsChar(input[j-1])) {
            name[k]=‘\0‘;
            prior=0;
            p=Add(p,name,prior);
        }

    }
    Out(root);
    return 0;
}

原文地址:https://www.cnblogs.com/snzhong/p/12594646.html

时间: 2024-11-08 13:11:49

基础实验4-2.6 目录树 (30分)- 建树+先序遍历的相关文章

7-30 目录树 (30分)

主要思路: 1.定义结构体node,包含1)名字name(2)指向下级目录指针ctl(3)指向下级文件指针file(4)指向同级目录或文件指针next(取决于它本身是目录还是文件). 定义一个全局的指针ptr,指向上一个处理完毕的结点,比如一开始在输入“a\b\c”的中,ptr一开始指向root,从root开始处理a,处理完后ptr指向a,然后从ptr(即a)开始处理b,处理完后ptr指向b,再从ptr(即b)开始处理c. 2.处理一行数据时,字符串后带\的为目录,否则为文件. 3.假设插入一个

A1135 | 红黑树判断:审题、根据“先序遍历”和“BST树”的条件生成后序遍历、递归判断

对A1135这题有心里阴影了,今天终于拿下AC.学习自柳神博客:https://www.liuchuo.net/archives/4099 首先读题很关键: There is a kind of balanced binary search tree named red-black tree in the data structure------ 红黑树首先应该是一棵BST树,不然从何谈起维护二分查找结构? 所以第一步就应该根据先序遍历以及BST树的特性来判断是否是一棵BST树,然后根据这两个条

mycat基础实验之主从配置读写分离和分表

mycat实验之主从配置读写分离和分表 架构图: 1.实验环境: vmware虚机3个   (虚机太少了,电脑有点吃力,3个虚机只能达到基本的测试) 系统centos7     (实验是关闭防火墙和selinux做的) mysql版本5.7 mycat版本1.6 虚机名字和ip: mysql1 192.168.211.138 mysql2 192.168.211.139 mysql3 192.168.211.142 mycat安装在mysql1(192.168.211.138) 这台主机须能够解

[二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)

1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences, or preorder and inorder traversa

树的前中后序遍历和层次遍历

遍历规则 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子树---> 根结点 ---> 右子树 后序遍历:左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 注: 1.前序.中序.后序属于深度优先遍历(使用递归较为方便),层次遍历为广度优先遍历(一般实现需要借助其他数据结构的支撑,如下面的队列等). 2.中序遍历有个小技巧:对于给定的树,可以画垂线,从左到右即为中序遍历的次序. 代码实现 #include <iostrea

基础实验7-2.4 PAT排名汇总 (25分)

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn). 每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩.考试结束后,各个考点的成绩将即刻汇总成一张总的排名表. 现在就请你写一个程序自动归并各个考点的成绩并生成总排名表. 输入格式: 输入的第一行给出一个

基础实验5-2.2 电话聊天狂人 (25分)-散列表

解题思路: 用散列表(链表结构) 1.计算散列表长度(取比输入数据大一点的素数p) 2.构造散列函数 3.读入数据,求出散列位置插入 4.一边遍历散列表,一边求出现最多的电话狂人 #include <stdio.h> #include <malloc.h> #include <string.h> #include <math.h> #define KeyLength 11 #define ElemType char typedef enum {false,t

【树论】二叉树的序遍历

原题传送门 思路 此题是本蒟蒻迈向黄金段位的最后一道题,然而本蒟蒻只用了10min便搞?掉了它QAQ,看来自己还是有进步的!!! TIPS 前序遍历:根-左-右 中序遍历:左-根-右 后序遍历:左-右-根 然后大爆搜就ojbk啦~~~ Code #include<iostream> #include<cstdio> #include<string> #include<vector> #include<algorithm> #include<

树的前中序遍历_求后续遍历

原文链接:http://blog.csdn.net/feliciafay/article/details/6816871 PreOrder:         GDAFEMHZ InOrder:           ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root.