#include <stdio.h>
typedef int ElemType;
typedef struct CSTNode
{
ElemType data;
struct CSTNode *firstChild;
struct CSTNode *nextSibling;
} CSTNode, *CSTree;
// 在树中只有根结点和子树之分,即树是由根结点和子树构成
// 在遍历的过程中,根和子树哪个先遍历的问题
// 先访问根,再访问每棵子树先根遍历
// 先访问每棵子树,由访问根,后根遍历
// 先根遍历
void preOrderTraverse(CSTree T)
{
if (T != NULL)
{
printf("%d ", T->data); // 先访问根
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
preOrderTraverse(pCurChild);
pCurChild = pCurChild->nextSibling;
}
}
}
// 后根遍历
void postOrderTraverse(CSTree T)
{
if (T != NULL)
{
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
postOrderTraverse(pCurChild);
pCurChild = pCurChild->nextSibling;
}
printf("%d ", pCurChild->data);
}
}
// 计算树的度
int getDegree(CSTree T)
{
if (T == NULL)
return 0;
else
{
// 先拿根结点的度与根结点的孩子为根的子树度进行比较,获得最大者
int maxSubTreeDegree = 0;
int rootNodeDegree = 0;
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
rootNodeDegree++;
int subTreeDegree = getDegree(pCurChild);
if (subTreeDegree > maxSubTreeDegree)
maxSubTreeDegree = subTreeDegree;
pCurChild = pCurChild->nextSibling;
}
return rootNodeDegree > maxSubTreeDegree ? rootNodeDegree : maxSubTreeDegree;
}
}
// 计算树的深度
int getTreeHeight(CSTree T)
{
if (T == NULL)
return 0;
else
{
int maxHeight = 0; // 记录子树最大者
// 计算每颗子树高度
CSTNode *pCurChild = T->firstChild;
while (pCurChild)
{
int curHeight = getTreeHeight(pCurChild);
if (curHeight > maxHeight)
maxHeight = curHeight;
pCurChild = pCurChild->nextSibling;
}
return maxHeight + 1;
}
}
// 计算一棵树T 以孩子兄弟链存储 的叶子节点数
int cnt = 0;
int getLeaves(CSTree T)
{
if (T->firstChild == NULL)
cnt++;
else
{
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
getLeaves(pCurChild);
}
}
return cnt;
}
/*
森林中,一棵树和其他树,遍历的时候一定是 遍历完这棵树,再遍历其他树
这棵树遍历有两种,一种是先根遍历,一种是后根遍历
先根遍历,根,根的子树,再遍历其他树(森林)类似于二叉树先序遍历 森林的(类)先序遍历
后根遍历,根的子树,根,再遍历其他树(森林)类似于二叉树中序遍历 森林的(类)中序遍历
*/
// 森林的先序遍历
void preOrderTraverse(CSTree T)
{
if (T != NULL)
{
printf("%d ", T->data);
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
preOrderTraverse(pCurChild);
pCurChild = pCurChild->nextSibling;
}
preOrderTraverse(T->nextSibling); // 森林T的nextSibling 是其他的树
// 子森林的根
}
}
// 森林的中序遍历
void inOrderTraverse(CSTree T)
{
if (T != NULL)
{
CSTNode *pCurChild = T->firstChild;
while (pCurChild != NULL)
{
inOrderTraverse(pCurChild);
pCurChild = pCurChild->nextSibling;
}
printf("%d ", pCurChild->data);
inOrderTraverse(T->nextSibling);
}
}
树和森林的基本操作
最新推荐文章于 2024-08-16 22:20:39 发布