二叉樹遍歷算法遞歸實現+層次遍歷

二叉樹遍歷算法

二叉樹的存儲結構

typedef struct BTNode
{
    char data;                //這裏默認結點data爲char型
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;

二叉樹的遍歷算法

1 先序遍歷

先序遍歷的操做以下。算法

若是二叉樹爲空樹,則什麼都不作;不然:數據結構

1)訪問根節點函數

2)先序遍歷左子樹post

3)先序遍歷右子樹code

描述以下:隊列

void preorder(BTNode *p)
{
    if(p != NULL)
    {
        visit(p);                //假設訪問函數Visit()已經定義過
        preorder(p->lchild);    //先序遍歷左子樹
        preorder(p->rchild);    //先序遍歷右子樹
    }
}

2 中序遍歷

中序遍歷的操做以下。it

若是二叉樹爲空樹,則什麼都不作;不然:class

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%;" />

上圖所示爲二叉樹的層次遍歷,即按照箭頭所指方向,按照一、二、三、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;
            }
        }
    }
}
相關文章
相關標籤/搜索