二叉树基本操作集合

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Yes 1
#define No 0
typedef char ElemType;
typedef short Status;
struct BiTreeNode/* 二叉树结点定义 */
{
    ElemType data;
    struct BiTreeNode *LChild;/* 左孩子指针 */
    struct BiTreeNode *RChild;/* 右孩子指针 */
};
struct StackNode/* 链栈结点 */
{
    struct BiTreeNode *pointer;/* 存储二叉树的根结点地址 */
    struct StackNode *next;
};
struct QueueNode/* 链队列结点 */
{
    struct BiTreeNode *pointer;/* 存储二叉树的根结点地址 */
    struct QueueNode *next;
};
struct QueueInfo/* 链队列信息结点 */
{
    QueueNode *Qfront;/* 队头指针 */
    QueueNode *Qrear;/* 队尾指针 */
};
/* */
void CreateBiTree(BiTreeNode* &T);
void PreOrderTraverse(BiTreeNode*&T);
void InOrderTraverse(BiTreeNode* &T);
void PostOrderTraverse(BiTreeNode* &T);
short Depth(BiTreeNode* &T);
short NodeCount(BiTreeNode* &T);
void CopyBiTree(BiTreeNode* &T, BiTreeNode* &newT);
Status InitStack(StackNode* &S);
Status Push(StackNode* &S, BiTreeNode *T);
Status Pop(StackNode* &S, BiTreeNode* &T);
Status StackEmpty(StackNode* &S);
void InOrderTraverse_NotRecursion(BiTreeNode* &T);
Status InitQueue(QueueInfo* &Q_Info);
Status EnQueue(QueueInfo* &Q_Info, BiTreeNode *T);
Status DeQueue(QueueInfo* &Q_Info, BiTreeNode* &T);
Status QueueEmpty(QueueInfo* &Q_Info);
short GetQueueLength(QueueInfo* &Q_Info);
BiTreeNode* GetQueueTop(struct QueueInfo* &Q_Info);
void LevelTraverse(BiTreeNode* &T);
short LeafNodeCount(BiTreeNode* &T);
Status BiTreeCompare(BiTreeNode* &T1, BiTreeNode* &T2);
short Degree1_NodeCount(BiTreeNode* &T);
short MaxWidth(BiTreeNode* &T);
short GetMax(short x, short y);
Status LevelTraverse2(BiTreeNode* &T);
/* */
int main()
{
    BiTreeNode *root;/* 树根指针 */
    BiTreeNode *copy_root;/* 二叉树复制品的根指针 */
    CreateBiTree(root);
    LevelTraverse2(root);
}
/* 层序遍历二叉树, 并按层输出(每一层占用单独一行) */
Status LevelTraverse2(BiTreeNode* &T)
{
    short i;
    short width;
    struct QueueInfo *Q_Info;
    struct BiTreeNode *p;
    struct BiTreeNode *q;
    InitQueue(Q_Info);/* 初始化链队列 */
    if(T != NULL)/* T不空 */
    {
        EnQueue(Q_Info, T);/* 根结点进队 */
    }
    while(QueueEmpty(Q_Info) != Yes)/* 只要队列不空 */
    {
        width = GetQueueLength(Q_Info);
        /* */
        for(i = 0; i < width; i ++)
        {
            DeQueue(Q_Info, q);/* 队头元素出队 */
            fprintf(stdout, "%c ", q -> data);/* 访问出队元素 */
            if(q -> LChild != NULL)/* 出队元素左孩子不空, 就将左孩子进队 */
            {
                EnQueue(Q_Info, q -> LChild);
            }
            if(q -> RChild != NULL)/* 出队元素右孩子不空, 就将右孩子进队 */
            {
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值