displaydlg.cpp
来自「winsail v2.0是用于DOS下的图形界面空间系统」· C++ 代码 · 共 1,590 行 · 第 1/3 页
CPP
1,590 行
return(m_pRoot);
}
//函数功能:得到根结点
CTreeNode* CTree::GetRoot(CTreeNode *pTreeNode)
{
if (pTreeNode == NULL)
{
return (NULL);
}
while (NULL != pTreeNode->pParent)
{
pTreeNode = pTreeNode->pParent;
}
return(pTreeNode);
}
//函数功能:求双亲
CTreeNode* CTree::GetParent(CTreeNode *pTreeNode)
{
return(pTreeNode->pParent);
}
//函数功能:求孩子
CTreeNode* CTree::GetChild(CTreeNode* pTreeNode, DWORD dwIndex)
{
//判断结点的合法性
if (pTreeNode == NULL)
{
return(NULL);
}
CTreeNode* pChild = pTreeNode->Node.Tree.pChild;
DWORD dwPoint = 0;
while ((dwPoint++) < dwIndex && NULL != pChild)
{
//如果是最后一棵子树
if (dwIndex == 0xFFFFFFFFlu && pChild->Node.Tree.pSibling == NULL)
{
break;
}
pChild = pChild->Node.Tree.pSibling;
}
return(pChild);
}
//函数功能:求右兄弟
CTreeNode* CTree::GetRightSibling(CTreeNode* pTreeNode, DWORD dwIndex)
{
//判断结点的合法性
if (pTreeNode == NULL)
{
return(NULL);
}
CTreeNode* pSibling = pTreeNode->Node.Tree.pSibling;
DWORD dwPoint = 0;
while ((dwPoint++) < dwIndex && NULL != pSibling)
{
//如果是最后一棵子树
if (dwIndex == 0xFFFFFFFFlu && pSibling->Node.Tree.pSibling == NULL)
{
break;
}
pSibling = pSibling->Node.Tree.pSibling;
}
return(pSibling);
}
//函数功能:插入子树
BOOL CTree::InsertChild(CTreeNode* pTarget, DWORD dwIndex, CTreeNode* pSource)
{
//判断指针的合法性
if (NULL == pTarget || NULL == pSource)
{
return(FALSE);
}
CTreeNode* pChild = NULL;
//第一棵子树
if (dwIndex == 0)
{
pSource->pParent = pTarget;
pSource->Node.Tree.pSibling = pTarget->Node.Tree.pChild;
pTarget->Node.Tree.pChild = pSource;
return (TRUE);
}
//最后一棵子树
else if (dwIndex == 0xFFFFFFFFlu)
{
pSource->pParent = pTarget;
pChild = this->GetChild(pTarget, 0xFFFFFFFFlu);
//第一棵子树
if (pChild == NULL)
{
pSource->Node.Tree.pSibling = pTarget->Node.Tree.pChild;
pTarget->Node.Tree.pChild = pSource;
}
//最后一棵子树
else
{
pSource->Node.Tree.pSibling = NULL;
pChild->Node.Tree.pSibling = pSource;
}
return(TRUE);
}
//不是第一棵子树
else
{
pChild = this->GetChild(pTarget, dwIndex - 1);
if (pChild != NULL)
{
pSource->pParent = pTarget;
pSource->Node.Tree.pSibling = pChild->Node.Tree.pSibling;
pChild->Node.Tree.pSibling = pSource;
return (TRUE);
}
}
return(FALSE);
}
//函数功能:删除子树
BOOL CTree::DeleteChild(CTreeNode* pTreeNode, DWORD dwIndex)
{
if (pTreeNode == NULL)
{
return(FALSE);
}
CTreeNode* pSibling = NULL;
CTreeNode* pSibling2 = NULL;
CTreeNode* pChild = this->GetChild(pTreeNode, dwIndex);
if (pChild == NULL)
{
return(FALSE);
}
//第一个孩子
if (dwIndex == 0)
{
//修改当前结点的第一个孩子:结点的兄弟结点作为当前结点的孩子
pTreeNode->Node.Tree.pChild =
pTreeNode->Node.Tree.pChild->Node.Tree.pSibling;
}
//最后一个孩子
else if (dwIndex == 0xFFFFFFFFlu)
{
pChild = pTreeNode->Node.Tree.pChild;
pSibling2 = pChild;
pSibling = pChild->Node.Tree.pSibling;
while (pSibling->Node.Tree.pSibling != NULL)
{
pSibling2 = pSibling;
pSibling = pSibling->Node.Tree.pSibling;
}
//第一个孩子
if (pSibling == NULL)
{
//修改当前结点的第一个孩子:NULL
pTreeNode->Node.Tree.pChild = NULL;;
}
//不是第一个孩子
else
{
pSibling2->Node.Tree.pSibling = NULL;
//修改要删除结点为孩子
pChild = pSibling;
}
}
//中间孩子
else
{
//后一个兄弟
pSibling = this->GetChild(pTreeNode, dwIndex + 1);
//前一个兄弟
pSibling2 = this->GetChild(pTreeNode, dwIndex - 1);
//修改兄弟
pSibling2->Node.Tree.pSibling = pSibling;
}
//删除指定结点
pChild->pParent = NULL;
pChild->Node.Tree.pSibling = NULL;
this->DeleteTree(pChild, m_pDeleteUser);
return(FALSE);
}
//函数功能:访问结点操作
CTreeNode* CTree::VisitTree(CTreeNode* pTreeNode, void* pUser, int nCol)
{
if (m_pVisitFc == NULL)
{
return(NULL);
}
return (m_pVisitFc(this, pTreeNode, pUser, m_nDegree, nCol));
}
//函数功能:析离结点操作
CTreeNode* CTree::MoveTree(CTreeNode* pTreeNode, void* pUser)
{
if (m_pMoveFc == NULL)
{
return(NULL);
}
return (m_pMoveFc(pTreeNode, pUser));
}
//函数功能:删除结点操作
CTreeNode* CTree::DeleteTree(CTreeNode* pTreeNode, void* pUser)
{
if (m_pDeleteFc == NULL)
{
return(NULL);
}
return (m_pDeleteFc(pTreeNode, pUser));
}
int CBinaryTree::CalcMaxDegree()
{
this->TraverseBinaryTree(CTree::CalcDegreeFc,
NULL, TRAVERSING_BINARYTREE_FIRST);
return (m_nMaxDegree);
}
//函数功能:建立树
BOOL CBinaryTree::BuildBinaryTree(CTreeNode* pRoot,
CTreeNode* pChildL, CTreeNode* pChildR)
{
this->ClearTree();
if (pRoot == NULL)
{
return(TRUE);
}
//设置根结点
m_pRoot = pRoot;
//设置左结点
m_pRoot->Node.BinaryTree.wFlagL = 0;
m_pRoot->Node.BinaryTree.pChildL = pChildL;
//设置右结点
m_pRoot->Node.BinaryTree.wFlagR = 0;
m_pRoot->Node.BinaryTree.pChildR = pChildR;
//设置左孩子结点的父亲
if (NULL != pChildL)
{
pChildL->pParent = pRoot;
}
//设置右孩子结点的父亲
if (NULL != pChildR)
{
pChildR->pParent = pRoot;
}
return(TRUE);
}
//遍历筛选函数
CTreeNode* CTree::CalcDegreeFc(CTree* pTree, CTreeNode* pTreeNode, void* pUser, int nDegree, int nCol)
{
return(NULL);
}
//函数功能:插入左子树
BOOL CBinaryTree::InsertChildL(CTreeNode* pNode, CTreeNode* pChildL)
{
//移去原来的右子树
if ((pNode->Node.BinaryTree.pChildL != NULL &&
m_pRoot->Node.BinaryTree.wFlagL == 0) && NULL != m_pMoveFc)
{
m_pMoveFc(pNode->Node.BinaryTree.pChildL, m_pMoveUser);
pNode->Node.BinaryTree.pChildL = NULL;
}
//设置新的右子树
m_pRoot->Node.BinaryTree.wFlagL = 0;
pNode->Node.BinaryTree.pChildL = pChildL;
//设置子树的父亲
if (pChildL != NULL)
{
pChildL->pParent = pNode;
}
return(TRUE);
}
//函数功能:插入右子树
BOOL CBinaryTree::InsertChildR(CTreeNode* pNode, CTreeNode* pChildR)
{
//移去原来的右子树
if ((pNode->Node.BinaryTree.pChildR != NULL &&
m_pRoot->Node.BinaryTree.wFlagR == 0 ) &&NULL != m_pMoveFc)
{
m_pMoveFc(pNode->Node.BinaryTree.pChildR, m_pMoveUser);
pNode->Node.BinaryTree.pChildR = NULL;
}
//设置新的右子树
m_pRoot->Node.BinaryTree.wFlagR = 0;
pNode->Node.BinaryTree.pChildR = pChildR;
//设置子树的父亲
if (pChildR != NULL)
{
pChildR->pParent = pNode;
}
return(TRUE);
}
//函数功能:以结点为根的遍历操作
CTreeNode* CBinaryTree::TraverseBinaryTree(CTreeNode* pTreeNode)
{
CTreeNode* pTreeNode_Target = NULL;
//指针不能为空
if (pTreeNode == NULL)
{
if (m_pnCol != NULL && m_nDegree >= 2)
{
for (int i = m_nDegree + 1; i < MAX_TREE_DEGREE; i++)
{
m_pnCol[i - 1] += 1 << (i - m_nDegree);
}
}
return(NULL);
}
int nOldDegree = m_nDegree;
//统计最大度
if (m_nMaxDegree < m_nDegree)
{
m_nMaxDegree = m_nDegree;
}
//根据不同的遍历类型,作出“先序”、“中序”、“后序”遍历树操作
switch (m_nVisitStyle)
{
//先序遍历
case TRAVERSING_BINARYTREE_FIRST:
{
//度计算
m_nDegree += 0;
//访问根结点
pTreeNode_Target = this->VisitTree(
pTreeNode, m_pVisitUser, m_pnCol[m_nDegree - 1]);
//列计算
if (m_pnCol != NULL)
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否是返回结果
if (pTreeNode_Target != NULL)
{
return(pTreeNode_Target);
}
//度计算
m_nDegree++;
//遍历左子树
if (0 == pTreeNode->Node.BinaryTree.wFlagL)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildL);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildL == NULL &&
pTreeNode->Node.BinaryTree.wFlagL == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否返回结果
if(pTreeNode_Target != NULL)
{
return (pTreeNode_Target);
}
//度计算
m_nDegree += 0;
//遍历右子树
if (0 == pTreeNode->Node.BinaryTree.wFlagR)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildR);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildR == NULL &&
pTreeNode->Node.BinaryTree.wFlagR == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否返回结果
if(pTreeNode_Target != NULL)
{
return (pTreeNode_Target);
}
break;
}
//中序遍历
case TRAVERSING_BINARYTREE_MIDDLE:
{
//度计算
m_nDegree++;
//遍历左子树
if (0 == pTreeNode->Node.BinaryTree.wFlagL)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildL);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildL == NULL &&
pTreeNode->Node.BinaryTree.wFlagL == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否返回结果
if(pTreeNode_Target != NULL)
{
return (pTreeNode_Target);
}
//度计算
m_nDegree--;
//访问根结点
pTreeNode_Target = this->VisitTree(
pTreeNode, m_pVisitUser, m_pnCol[m_nDegree - 1]);
//列计算
if (m_pnCol != NULL)
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否是返回结果
if (pTreeNode_Target != NULL)
{
return(pTreeNode_Target);
}
//度计算
m_nDegree += 1;
//遍历右子树
if (pTreeNode->Node.BinaryTree.wFlagR == 0)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildR);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildR == NULL &&
pTreeNode->Node.BinaryTree.wFlagR == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否返回结果
if(pTreeNode_Target != NULL)
{
return (pTreeNode_Target);
}
break;
}
//后序遍历
case TRAVERSING_BINARYTREE_LAST:
{
//度计算
m_nDegree++;
//遍历左子树
if (pTreeNode->Node.BinaryTree.wFlagL == 0)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildL);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildL == NULL &&
pTreeNode->Node.BinaryTree.wFlagL == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
//是否返回结果
if(pTreeNode_Target != NULL)
{
return (pTreeNode_Target);
}
//度计算
m_nDegree += 0;
//遍历右子树
if (pTreeNode->Node.BinaryTree.wFlagR == 0)
{
pTreeNode_Target = this->TraverseBinaryTree(
pTreeNode->Node.BinaryTree.pChildR);
}
//列计算
if (m_pnCol != NULL &&
(pTreeNode->Node.BinaryTree.pChildR == NULL &&
pTreeNode->Node.BinaryTree.wFlagR == 0))
{
m_pnCol[m_nDegree - 1] += 1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?