| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 729 人关注过本帖
标题:求遍历 生成一个树目录的算法。
只看楼主 加入收藏
chenbofeng20
Rank: 4
来 自:陕西 宝鸡
等 级:业余侠客
威 望:3
帖 子:113
专家分:274
注 册:2009-9-18
结帖率:75%
收藏
已结贴  问题点数:100 回复次数:7 
求遍历 生成一个树目录的算法。
将取到的(0,A)   (0,B)    (0,C)
        (A,A1) (B,B1)   (C,C1)
        (A,A2) (B,B2)。。。。。。。。。这种规律的一组数据
以树目录显示
如:
 A
  ...A1
  ...A2
 B
  ...B1
  ...B2
 C
  ...C1
 .
 .
 .
2013-04-23 12:39
chenbofeng20
Rank: 4
来 自:陕西 宝鸡
等 级:业余侠客
威 望:3
帖 子:113
专家分:274
注 册:2009-9-18
收藏
得分:0 
求大神讲解!!!!!!!
2013-04-24 15:46
chenbofeng20
Rank: 4
来 自:陕西 宝鸡
等 级:业余侠客
威 望:3
帖 子:113
专家分:274
注 册:2009-9-18
收藏
得分:0 
等待回复中
2013-04-27 16:25
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:25 
这个你就用树结构图解救哦啊

Maybe
2013-04-29 03:16
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:25 
数据太少,没看到规律,再往下拉两行


[fly]存在即是合理[/fly]
2013-04-29 09:28
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:25 
关注  楼主拿出更详细的资料

DO IT YOURSELF !
2013-05-01 10:12
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:25 
设0为根节点

解析:(0.*) *为根的子节点
解析:(*1,*2)*2为*1的子节点

多叉树,可考虑左子右兄弟的写法
2013-05-02 10:05
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
程序代码:
#ifndef _CUserFileClass_H_
#define _CUserFileClass_H_

#ifndef  NAME_LENGTH
#define  NAME_LENGTH 50
#endif

#ifndef MAX_PATH
#define MAX_PATH 250
#endif

//------------------------------------------
//              作者:守候                 |
//              日期:2013.2.7             |
//              内容:多叉树               |
//------------------------------------------
#include <iostream>
using namespace std;
#include <vector>
#include <iterator>

class CUserFileClass;
class CUserFileNode
{
public:
    friend class CUserFileClass;

    CUserFileNode();
    ~CUserFileNode();

    CUserFileNode(const CUserFileNode &t);
    CUserFileNode & operator = (const CUserFileNode &t);
public:
    BOOL setFileName(const CHAR* _str);
//     BOOL setFilePath(const CHAR* _str);
//     BOOL setFileType(const CHAR* _str);

    CUserFileNode *getLeftChild()
    {
        return m_pLeftChild;
    }
    CUserFileNode *getRightBrother()
    {
        return m_pRightBrother;
    }
    __int32 getDeep()
    {
        return m_nDeep;
    }
    CHAR *getFileName()
    {
        return m_strFileName;
    }
private:
//----function----
    void clear();
    void copy(const CUserFileNode& t);

//----member----
    CHAR m_strFileName[NAME_LENGTH];
//    CHAR m_strFileType[NAME_LENGTH];
//    CHAR m_strFilePath[MAX_PATH];

    __int32 m_nDeep;
    CUserFileNode *m_pLeftChild;
    CUserFileNode *m_pRightBrother;

};

//----------------------------------
#define FILE_OK 0
class CUserFileClass
{
public:
    CUserFileClass();
    ~CUserFileClass();
    CUserFileClass(const CUserFileClass & t);
    CUserFileClass &operator=(const CUserFileClass & t);

    //----insert----
    CUserFileNode* insert_root(const CUserFileNode *root);
    void insert_left(CUserFileNode* root_val,CUserFileNode *root_aim);
    void insert_right(CUserFileNode* root_val,CUserFileNode *root_aim);
    void clear()
    { 
        m_size = 0;
        m_Array.clear();
        delete_all(m_root->m_pLeftChild);
        m_root->m_pLeftChild = NULL;
        m_root->m_pRightBrother = NULL;
    }

    //----check and find ----
    CUserFileNode* getRoot()
    {
        return m_root;
    }
    __int32 getSize();
    vector<CUserFileNode*>& midArray();
    void refresh();

private:
    CUserFileNode *m_root;
    __int32 m_size;
    vector<CUserFileNode*> m_Array;

//------------function---------
    void delete_all(CUserFileNode *root);
    void copy(CUserFileNode  **root_val,const CUserFileNode  *root_aim,__int32 _deep);

    //---check and find---
    void algorithm_size(const CUserFileNode *root);
    void algorithm_mid(const CUserFileNode *root);
};
#endif


头文件
程序代码:
#include "stdafx.h"
#include "CUserFileClass.h"

//------------------------Node-----------------------
CUserFileNode::CUserFileNode()
{
    clear();
}
CUserFileNode::~CUserFileNode()
{
    clear();
}
CUserFileNode::CUserFileNode(const CUserFileNode &t)
{
    copy(t);
}
CUserFileNode & CUserFileNode::operator =(const CUserFileNode&t)
{
    if(this == &t)
        return *this;
    copy(t);
    return *this;
}
void CUserFileNode::clear()
{
    memset(m_strFileName,0,NAME_LENGTH);
//     memset(m_strFileType,0,NAME_LENGTH);
//     memset(m_strFilePath,0,MAX_PATH);

    m_pLeftChild = NULL;
    m_pRightBrother = NULL;
    m_nDeep = 0;
}
void CUserFileNode::copy(const CUserFileNode& t)
{
    memcpy(m_strFileName,t.m_strFileName,NAME_LENGTH);
//     memcpy(m_strFileType,t.m_strFileType,NAME_LENGTH);
//     memcpy(m_strFilePath,t.m_strFilePath,MAX_PATH);

//     m_pLeftChild    = t.m_pLeftChild;
//     m_pRightBrother = t.m_pRightBrother;
}
BOOL CUserFileNode::setFileName(const CHAR* _str)
{
    __int32 len = _tcslen(_str);
    if(len > NAME_LENGTH)
        return FALSE;
    memset(m_strFileName,0,NAME_LENGTH);
    memcpy(m_strFileName,_str,len);
    return TRUE;
}
// BOOL CUserFileNode::setFilePath(const CHAR* _str)
// {
//     __int32 len = _tcslen(_str);
//     if(len > MAX_PATH)
//         return FALSE;
//     memset(m_strFilePath,0,MAX_PATH);
//     memcpy(m_strFilePath,_str,len);
//     return TRUE;
// }
// BOOL CUserFileNode::setFileType(const CHAR* _str)
// {
//     int len = _tcslen(_str);
//     if(len > NAME_LENGTH)
//         return FALSE;
//     memset(m_strFileType,0,NAME_LENGTH);
//     memcpy(m_strFileType,_str,len);
//     return TRUE;
// }
//------------------------











//-------------------------root----------------------
CUserFileClass::CUserFileClass()
{
    m_root = new CUserFileNode;
    m_root->m_nDeep = 0;
    m_size = 0;
}
CUserFileClass::~CUserFileClass()
{
    delete_all(m_root);
    m_root = NULL;
    m_size = 0;
}
CUserFileClass::CUserFileClass(const CUserFileClass & t)
{
    delete_all(m_root);
    copy(&m_root,t.m_root,t.m_root->m_nDeep);
    m_size = t.m_size;
}
CUserFileClass & CUserFileClass::operator=(const CUserFileClass & t)
{
    if(this == &t)
        return *this;
    delete_all(m_root);
    copy(&m_root,t.m_root,t.m_root->m_nDeep);
    m_size = t.m_size;
    return *this;
}
//-----------------insert-----------------
CUserFileNode* CUserFileClass::insert_root(const CUserFileNode *root)
{
    CUserFileNode *_pR = m_root->m_pLeftChild;
    if(_pR == NULL)
    {
        copy(&m_root->m_pLeftChild,root,m_root->m_nDeep + 1);
        return m_root->m_pLeftChild;
    }
    else
    {
        while(_pR->m_pRightBrother)
            _pR = _pR->m_pRightBrother;
        copy(&_pR->m_pRightBrother,root,m_root->m_nDeep + 1);
        return _pR->m_pRightBrother;
    }    
    return NULL;
}
void CUserFileClass::insert_left(CUserFileNode* root_val,CUserFileNode *root_aim)
{
    if(root_val->m_pLeftChild == NULL)
        copy(&root_val->m_pLeftChild,root_aim,root_val->m_nDeep + 1);
    else
    {
        CUserFileNode *_pl = root_val->m_pLeftChild;
        CUserFileNode *_paim = root_aim;
        while(_paim->m_pLeftChild)
            _paim = _paim->m_pLeftChild;
        copy(&root_val->m_pLeftChild,root_aim,root_val->m_nDeep + 1);
        _paim->m_pLeftChild = _pl;
    }
}
void CUserFileClass::insert_right(CUserFileNode* root_val,CUserFileNode *root_aim)
{
    if(root_val->m_pRightBrother == NULL)
        copy(&root_val->m_pRightBrother,root_aim,root_val->m_nDeep);
    else
    {
        CUserFileNode *_pl = root_val->m_pRightBrother;
        CUserFileNode *_paim = root_aim;
        while(_paim->m_pRightBrother)
            _paim = _paim->m_pRightBrother;
        copy(&root_val->m_pRightBrother,root_aim,root_val->m_nDeep);
        _paim->m_pRightBrother = _pl;
    }
}
//----------------------------------------
void CUserFileClass::delete_all(CUserFileNode *root)
{
    if(root != NULL)
    {
        delete_all(root->m_pLeftChild);
        delete_all(root->m_pRightBrother);
        delete root;
    }
}
void CUserFileClass::copy(CUserFileNode **root_val,const CUserFileNode *root_aim,__int32 _deep)
{
    if(root_aim != NULL)
    {
         *root_val = new CUserFileNode;
         ASSERT(root_val != NULL);
         **root_val = *root_aim;
         (*root_val)->m_nDeep = _deep;
         copy(&(*root_val)->m_pLeftChild,root_aim->m_pLeftChild, (*root_val)->m_nDeep + 1);
         copy(&(*root_val)->m_pRightBrother,root_aim->m_pRightBrother, (*root_val)->m_nDeep);
    }
}

//-------------check and find--------------------
void CUserFileClass::refresh()
{
    m_size = 0;
    m_Array.clear();

    algorithm_size(m_root->m_pLeftChild);
    algorithm_mid(m_root->m_pLeftChild);
}
__int32 CUserFileClass::getSize()
{
    return m_size;
}
vector<CUserFileNode*>& CUserFileClass::midArray()
{
    return m_Array;
}

void CUserFileClass::algorithm_size(const CUserFileNode *root)
{
    if(root != NULL)
    {
        m_size ++;
        algorithm_size(root->m_pLeftChild);
        algorithm_size(root->m_pRightBrother);
    }
}
void CUserFileClass::algorithm_mid(const CUserFileNode *root)
{
    if(root != NULL)
    {
        m_Array.push_back((CUserFileNode*)root);
        algorithm_mid(root->m_pLeftChild);
        algorithm_mid(root->m_pRightBrother);
    }
}


曾对一个文件管理写过一个初略的多叉树源码,你可以更改为模板并跟对特定字符写个插入就可以了
2013-05-02 10:08
快速回复:求遍历 生成一个树目录的算法。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.087884 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved