有一块数据,是树结构存放的。
一个父节点可能对应了n个字节点。
所有节点都读取出来了,个数可以得到,m。
节点数据结构大概是struct NODE

    DWORD dwParent;
    DWORD dwThis;
    DWORD dwData;
}
现在我想利用MFC的TreeCtrl控件来显示这块数据。有几个疑问
1.由于条件限制,我只能一块一块读取节点,最困难的地方是,读取出来的节点是乱序的,也就是说,插入了一个父节点后,又可能读取到这个节点的父节点。
2.不知道是不是需要先对节点中的父节点号进行排序。
3.有没有更好的实现方法,更高的效率

解决方案 »

  1.   

    可以在读取树的节点的时候顺便写入到TreeCtrl的节点。可以用递归或者非递归的方法宽度遍历你的树
      

  2.   

    恩 我现在有了点头绪
    因为dwThis是唯一的,节点数目也得到了。我就用了个数组来存放TreeCtrl所有节点的句柄。
    hItem[dwThis] = InsertItem("节点的值",  , hItem[根节点句柄], hItem[dwParent]);
    但是发现,各个文件夹节点都是混乱的,很多孙子文件夹都插入到了根节点中,我感觉我的方法应该每问题吧这里进入下一个环节了。节点分为了2个类型,A,B。其实可以理解成文件管理器。我希望把文件夹在TREE里显示,文件在旁边的LIST里显示。但是文件管理器中,展开某个文件夹节点,会调用相关函数去读取系统。我希望将前面已经读取出来的信息缓存到TREE里并且不显示,当展开这个文件夹节点,直接将这个节点对应的缓冲区的内容显示出来,应该如何实现呢。
      

  3.   

    typedef struct tagTVITEM{
        UINT      mask;
        HTREEITEM hItem;
        UINT      state;
        UINT      stateMask;
        LPTSTR    pszText;
        int       cchTextMax;
        int       iImage;
        int       iSelectedImage;
        int       cChildren;
        LPARAM    lParam;
    } TVITEM, FAR *LPTVITEM;
    注意到红色的部分了么?每个节点都是可以存用户的参数的,你把你要显示的数据放在这里面,等到要显示的时候就取出来就行了。
      

  4.   

    恩 谢谢。
    但是我的一个节点可能会包含几千几万个子节点,我能想到的方法就是将这些子节点放进数组,将这个数组和lparam参数进行绑定,但是这样会不会低效
    是否有更高效的方法么