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);
}
}