设为首页 加入收藏

TOP

C语言实现二叉树的常用的算法(递归与非递归实现遍历) (五)
2014-11-23 22:19:18 来源: 作者: 【 】 浏览:7
Tags:语言 实现 常用 算法
raverse(pBTree->lchild); // 中序遍历左子树
printf("%c", pBTree->data); // 中序访问根结点
InOrderTraverse(pBTree->rchild); // 中序遍历右子树
}
}

/*****************************************************************************
* 方法名:PostOrderTraverse
* 描述: 后序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void PostOrderTraverse(BTree *pBTree)
{
if (pBTree)
{
PostOrderTraverse(pBTree->lchild); // 后序遍历左子树
PostOrderTraverse(pBTree->rchild); // 后序遍历右子树
printf("%c", pBTree->data); // 后序访问根结点
}
}

/*****************************************************************************
* 方法名:LevelOrderTraverse
* 描述: 层序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void LevelOrderTraverse(BTree *pBTree)
{
Queue queue; // 队列变量
QueueElemType e; // 队列元素指针变量

InitializeQueue(&queue); // 初始化队列

if (pBTree != NULL)
{
EnQueue(&queue, *pBTree); // 将根结点指针入队
}

while (!IsQueueEmpty(queue))
{
DeQueue(&queue, &e);

printf("%c", e.data);

if (e.lchild != NULL) // 若存在左孩子,则左孩子入队
{
EnQueue(&queue, *e.lchild);
}

if (e.rchild != NULL) // 若存在右孩子,则右孩子入队
{
EnQueue(&queue, *e.rchild);
}
}
}

/*****************************************************************************
* 方法名:GetDepth
* 描述: 获取树的深度
* 参数: pBTree--指向BTree结构体的指针
* 返回值:树的深度
******************************************************************************/
int GetDepth(BTree *pBTree)
{
int depth = 0;
int leftDepth = 0;
int rightDepth = 0;

if (pBTree)
{
leftDepth = GetDepth(pBTree->lchild); // 获取左子树的深度
rightDepth = GetDepth(pBTree->rchild); // 获取右子树的深度

depth = leftDepth > rightDepth leftDepth + 1: rightDepth + 1;
}

return depth;
}

/*****************************************************************************
* 方法名:IsLeaf
* 描述: 判断该结点是否为叶子结点
* 参数: node--结点
* 返回值:1--表示叶子结点,0--表示非叶子结点
******************************************************************************/
int IsLeaf(BTree node)
{
if (node.lchild == NULL && node.rchild == NULL)
{
return 1;
}

return 0;
}

/*****************************************************************************
* 方法名:TraverseLeafNodes
* 描述: 遍历所有的叶子结点
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void TraverseLeafNodes(BTree *pBTree)
{
if (pBTree != NULL)
{
if (1 == IsLeaf(*pBTree))
{
printf("%c", pBTree->data);
}
else
{
TraverseLeafNodes(pBTree->lchild);
TraverseLeafNodes(pBTree->rchild);
}
}
}

//
// 判断一棵二叉树是否为平衡二叉树
// 平衡二叉树的定义: 如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树
// 算法思路:递归判断每个节点的左右子树的深度是否相差大于1,如果大于1,说明该二叉树不
// 是平衡二叉树,否则继续递归判断
int IsBalanceBinaryTree(BTree *pBTree)
{
int leftDepth = 0;
int rightDepth = 0;
int distance = 0;

if (pBTree != NULL)
{
leftDepth = GetDepth(pBTree->lchild); // 获取左子树的深度
首页 上一页 2 3 4 5 6 7 8 下一页 尾页 5/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中malloc函数返回值是否需要.. 下一篇C语言中异常处理的两个函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: