📄 treeinfo.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 + -