二叉树遍历算法

二叉树的存储构造

typedef struct BTNode{    char data;                //这里默认结点data为char型    struct BTNode *lchild;    struct BTNode *rchild;}BTNode;

二叉树的遍历算法

1 先序遍历

先序遍历的操作如下。

如果二叉树为空树,则什么都不做;否则:

1)拜访根节点

2)先序遍历左子树

3)先序遍历右子树

形容如下:

void preorder(BTNode *p){    if(p != NULL)    {        visit(p);                //假如拜访函数Visit()曾经定义过        preorder(p->lchild);    //先序遍历左子树        preorder(p->rchild);    //先序遍历右子树    }}

2 中序遍历

中序遍历的操作如下。

如果二叉树为空树,则什么都不做;否则:

1)中序遍历左子树

2)拜访根节点

3)中序遍历右子树

形容如下:

void inorder(BTNode *p){    if(p != NULL)    {        inorder(p->lchild);        visit(p);        inorder(p->rchild);    }}

3 后序遍历

后序遍历的操作如下。

如果二叉树为空树,则什么都不做;否则:

1)后序遍历左子树

2)后序遍历右子树

3)拜访根节点

形容如下:

void postorder(BTNode *p){    if(p != NULL)    {        postorder(p->lchild);        postorder(p->rchild);        visit(p);    }}

4 档次遍历

<img src="https://irabbit756.oss-cn-shanghai.aliyuncs.com/数据结构/二叉树遍历/1二叉树档次遍历.png" style="zoom: 67%;" />

上图所示为二叉树的档次遍历,即依照箭头所指方向,依照1、2、3、4的档次程序,对二叉树中各个结点进行拜访(此图反映的是自左至右的档次遍历,自右至左的形式相似)
要进行档次遍历,须要建设一个循环队列先将二叉树头结点入队列,而后出队列,拜访该结点,如果它有左子树,则将左子树的根结点入队;如果它有右子树,则将右子树的根结点入队。而后出队列,对出队结点拜访。如此重复,直到队列为空为止。
由此失去的对应算法如下:

void level(BTNode *p){    int  front,rear;    BTNode *que[maxSize];        //定义一个循环队列,用来记录将要拜访的档次上的结点    front = rear = 0;    BTNode *q;    if(p != NULL)    {        rear = (rear + 1) % maxSize;        que[rear] = p;                    //根结点入队        while(front != rear)            //当队列不空的时候进行循环        {            front = (front + 1) % maxSize;            q = que[front];                //队头结点出队            visit(q);                    //访问队头结点            if(q->lchild != NULL)        //如果左子树不空,则左子树的根结点入队            {                rear = (rear + 1) % maxSize;                que[rear] = q->lchild;            }            if(q->rchild != NULL)        //如果右子树不空,则右子树的根结点入队            {                rear = (rear + 1) % maxSize;                que[rear] = q->rchild;            }        }    }}