⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeinfo.h

📁 Resource editor base speadrum Chinese mobile
💻 H
字号:
// FileName: TreeInfo.h
// Author:   Anli.wei
// Date:     2005-2-22
// Comment:  定义树的属性结构,并实现属性结构操作的封装,使用时:
//           1. 应派生CTreeNode类,添加自己需要的属性。
//           2. 派生CTreeInfo类,重新实现MallocNode和ZeroNode两个函数
//////////////////////////////////////////////////////////////////////

#ifndef _TREEINFO_H__
#define _TREEINFO_H__

class CTreeNode
{
public:
    CTreeNode() { pParent = pChild = pPrev = pNext = NULL; }
	virtual ~CTreeNode() {}

protected:
	// 父节点
	CTreeNode * pParent;
	// 子节点(如子节点有多个,这里只指第一个)
	CTreeNode * pChild;
	// 上一个兄弟节点, NULL表示没有
	CTreeNode * pPrev;
	// 下一个兄弟节点, NULL表示没有
	CTreeNode * pNext;

	friend class CTreeInfo;
};

typedef CTreeNode TREE_NODE, * PTREENODE;
typedef const TREE_NODE * PCTREENODE;

class CTreeInfo  
{
public:

	// 在进行操作前,必须首先调用此函数(形成虚拟的根节点),
	// 否则其余的操作不会有效。
	BOOL InitRoot(void);
  
	// 获取虚拟的根节点(此节点指向节点序列对应的节点,此外无实际意思)
    PCTREENODE GetRoot(void) const { return m_pRoot; }

	// 获取当前节点的父节点
    PTREENODE GetParent(PCTREENODE pcNode) const;
    // 置当前节点的父节点
    void SetParent(PTREENODE pCur, PCTREENODE pParent) const;

	// 获取当前节点的子节点
    PTREENODE GetChild( PCTREENODE pcNode, int nIdx = 0 ) const;
    // 置当前节点的子节点
    void SetChild(PTREENODE pCur, PCTREENODE pChild) const;
    // 获取当前节点子节点的数量(不包含孙子节点)
    int GetChildCount(PCTREENODE pcNode) const;
	// 给定节点是否具有子节点(此函数效率高)
    BOOL IsHasChild(PCTREENODE pcNode) const { return (pcNode != NULL) && (pcNode->pChild != NULL); }

    // 获取当前节点的上一个兄弟节点
    PTREENODE GetPrev( PCTREENODE pcNode )const;
    // 置当前节点的上一个兄弟节点
    void SetPrev(PTREENODE pCur, PCTREENODE pcPrev) const;

    // 获取当前节点的下一个兄弟节点
    PTREENODE GetNext( PCTREENODE pcNode ) const;
    // 置当前节点的下一个兄弟节点
    void SetNext(PTREENODE pCur, PCTREENODE pcNext) const;

	// 为当前节点添加子节点
	BOOL AddChild(PTREENODE pParent, PTREENODE pChild, BOOL bLast = TRUE) const;
    // 以当前选中节点为基准插入兄弟节点
    BOOL InsertInBrothers(PTREENODE pBase, PTREENODE pBrother, BOOL bBefore = TRUE);

    // 在兄弟节点中移动当前节点(改变当前节点在兄弟节点中的顺序)。
	BOOL MoveInBrothers(PTREENODE pNode, BOOL bDown = TRUE);

	// 拷贝当前节点(当前节点如有子节点,则包括子节点)。
    // 注意:各节点是重新NEW出来的,使用时应不应忘记Remove
    PTREENODE CopyNode( PCTREENODE pcNode );

	// 将给定的节点孤立出来
    // 注意:需要将兄弟节点连接起来
	void IsolateNode(PTREENODE pNode);

    // 获取给定节点的子节点的层数(有几层子节点),不包含本身。
    // 0说明无子节点,1说明有1层子节点,2说明有两层子节点...
	UINT GetLevelCount( PCTREENODE pcNode ) const;
    // 获取当前节点,给定层数的节点的数量。
	UINT GetCountInLevel(PCTREENODE pcNode, int nLevel) const;
    // 获取当前节点,给定层数,给定索引的节点。说明:这些节点的索引顺序
    // 按照在节点树中的顺序由上到下排列。
	PTREENODE GetNodeInLevel(PCTREENODE pcNode, int nLevel, int nIndex) const;

    // 获取当前给定节点的所有子孙节点的数量(包括本身)
	UINT GetAllPosteritiesCount(PCTREENODE pcNode) const;
    // 给定的节点(lpcNode)是否是lpcParent的子孙节点(包括本身)
    BOOL IsPosterity(PCTREENODE pcParent, PCTREENODE pcNode) const;

	// 删除当前节点(当前节点如有子节点,则包括子节点)
	void RemoveNode(PTREENODE lpNode);
	// 删除所有的节点,释放占用的内存
	void RemoveAll(void);

	//////////////////////////////////////////////////////////////////////
	// virtual fun 需要在派生类中重新实现
	//////////////////////////////////////////////////////////////////////
	// 从内存中分配一个新节点,此函数应在派生类中重新实现,以便获取实际节点。
	virtual PTREENODE MallocNode( void );
    virtual void      FreeNode( PTREENODE pNode );
    // 获取节点的大小,此函数应在派生类中重新实现,以便获取实际节点的大小。
	virtual int GetNodeSize(void) const { return sizeof(TREE_NODE); }
    // 将节点信息置零。注意:由于节点有虚函数表,所以不能使用memset(...sizeof())来实现
    virtual void ZeroNode( PTREENODE pNode );

public:
	CTreeInfo();
	virtual ~CTreeInfo();

private:

    // 获取当前节点,给定层数,给定索引的节点。说明:这些节点的索引顺序
    // 按照在节点树中的顺序由上到下排列。
	PTREENODE GetLevelInternalUse(PCTREENODE pcNode, int nLevel, int &nIndex) const;
    void RemoveNodeInternalUse(PTREENODE pNode);

private:
    // 虚拟的根节点,整个节点树的根,他的子节点对应实际的项
	PTREENODE m_pRoot;
};

#endif // _TREEINFO_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -