zoukankan      html  css  js  c++  java
  • 基础实验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;
    }
  • 相关阅读:
    python 基础文件操作
    python 基础之文件读操作
    python基础之省份三级菜单
    python 基础之字符串方法
    python 基础之字典一
    python 基础之简单购物车小程序实现
    c语言 四种方法调用数组
    c# windows编程控件学习-1
    c# windows编程控件学习-2
    C# 列主元素(Gauss)消去法 计算一元多次方程组
  • 原文地址:https://www.cnblogs.com/snzhong/p/12594646.html
Copyright © 2011-2022 走看看