Day8:二叉树的C语言实现

1. 结构体定义

typedef struct BiNode {
    int data;                           // 数据域
    struct BiNode *lchild, *rchild;     // 左右孩子
}BiNode, *BiTree;

2. 先序遍历

void BiTreePreOrder(BiTree bt)
{
    if(bt != NULL) {
        printf("%d ", bt->data);
        BiTreePreOrder(bt->lchild);
        BiTreePreOrder(bt->rchild);
    }
}

3. 中序遍历

void BiTreeInOrder(BiTree bt)
{
    if(bt != NULL) {
        BiTreeInOrder(bt->lchild);
        printf("%d ", bt->data);
        BiTreeInOrder(bt->rchild);
    }
}

4. 后序遍历

void BiTreePostOrder(BiTree bt)
{
    if(bt != NULL) {
        BiTreePostOrder(bt->lchild);
        BiTreePostOrder(bt->rchild);
        printf("%d ", bt->data);
    }
}

5. 非递归的遍历

先序、中序和后序遍历也可以借助栈来实现非递归的遍历。基本思想是不断压入当前结点,并查找左孩子;当没有左孩子时,弹出结点并查找右孩子。先序遍历和中序遍历只需考虑结点是在进栈时遍历还是在出栈时遍历即可。对于后序遍历,在出栈前还要判断其右孩子是否存在,如存在则继续压入右孩,否则弹出并遍历结点。

6. 层次遍历

二叉树的层次遍历需要借助队列,可以对Day7的链队列加以简单改造,使之可以接受树结点作为数据元素。层次遍历的实现如下:

void BiTreeLevelOrder(BiTree bt)
{
    LinkQueue *lq = malloc(sizeof(LinkQueue));
    LinkQueueInit(lq);
    LinkQueueEnQueue(lq, bt);
    while(LinkQueueEmpty(lq) < 0) {
        BiNode **p;                 // p为指向BiNode指针的指针,(*p)为一个BiNode的指针
        LinkQueueDeQueue(lq, p);            // 队列中只保存指针也即结点的地址信息
        printf("%d ", (*p)->data);
        if((*p)->lchild != NULL)
            LinkQueueEnQueue(lq, (*p)->lchild);
        if((*p)->rchild != NULL)
            LinkQueueEnQueue(lq, (*p)->rchild);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值