學習筆記: 樹的遍歷

二叉樹的遍歷有三種方式:前序遍歷(preparse)、中序遍歷(inparse)、後序遍歷(postparse)

前序遍歷:按照根結點、左子樹、右子樹的順序輸出結點編號。

中序遍歷:按照左子樹、根結點、右子樹的順序輸出結點編號。

後序遍歷:按照左子樹、右子樹、根節點的順序輸出結點編號。

計算機二級考試中,這也是一個基本的考點。下面給出三種樹的遍歷的代碼實現。

/*樹的遍歷*/
#include <cstdio>
const int MAX = 10000;
const int NIL = -1;

struct Node {
    int parent;
    int left;
    int right;
}tree[MAX];

int n;

void PreParse(int u);
void InParse(int u);
void PostParse(int u);

int main()
{
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);

    while (scanf("%d", &n) != EOF) {
        int u, left, right, root;
        for (int i = 0; i < n; i++)
            tree[i].parent = tree[i].left = tree[i].right = NIL;

        for (int i = 0; i < n; i++) {
            scanf("%d %d %d", &u, &left, &right);
            tree[u].left = left;
            tree[u].right = right;
            if (left != NIL) tree[left].parent = u;
            if (right != NIL) tree[right].parent = u;
        }

        for (int i = 0; i < n; i++)
            if (tree[i].parent == NIL)
                root = i;

        printf("Preorder\n");
        PreParse(root);
        printf("\n");

        printf("Inorder\n");
        InParse(root);
        printf("\n");

        printf("PostParse\n");
        PostParse(root);
        printf("\n");
    }

    return 0;
}
//前序遍歷
void PreParse(int u)
{
    if (u == NIL)
        return;
    printf("%d ", u); //先遍歷根結點
    PreParse(tree[u].left);//再遍歷左子樹
    PreParse(tree[u].right);//最後遍歷右子樹
    return;
}
//中序遍歷
void InParse(int u)
{
    if (u == NIL)
        return;
    InParse(tree[u].left); //先遍歷左子樹
    printf("%d ", u);      //再遍歷根節點
    InParse(tree[u].right);//最後遍歷右子樹
}
//後序遍歷
void PostParse(int u)
{
    if (u == NIL)
        return;
    PostParse(tree[u].left);//先遍歷左子樹
    PostParse(tree[u].right);//再遍歷右子樹
    printf("%d ", u);        //最後遍歷根結點
}


發佈了58 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章