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

Posted snzhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础实验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
",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]!=; j++) {
            if(IsChar(input[j]))
                name[k++]=input[j];
            else if(input[j]==) {
                name[k]=;
                prior=1;
                p=Add(p,name,prior);
                k=0;
            }
        }
        if(input[j]==&&IsChar(input[j-1])) {
            name[k]=;
            prior=0;
            p=Add(p,name,prior);
        }

    }
    Out(root);
    return 0;
}

 

以上是关于基础实验4-2.6 目录树 (30分)- 建树+先序遍历的主要内容,如果未能解决你的问题,请参考以下文章

博客作业04--树

1020 Tree Traversals (25 分) 难度: 中 / 知识点: 哈希表建树 遍历树

进阶实验8-2.3 二叉搜索树的最近公共祖先 (30分)

PTA 1004 Counting Leaves (30)(30 分)(建树dfs或者bfs,未AC 段错误)

进阶实验8-2.3 二叉搜索树的最近公共祖先 (30分)

1064 Complete Binary Search Tree (30 分)难度: 一般 / 知识点: 完全二叉搜索树