樹的遍歷(前序,中序,後序遍歷)

前序遍歷(Preorder):根節點,左子樹,右子樹的順序
中序遍歷(Inorder):左子樹,根節點,右子樹的順序
後序遍歷(Postorder):左子樹,右子樹,根節點的順序

#include <iostream>
#include <cstdio>
#define Max 100000
#define NIL -1
using namespace std;
int n;
struct node
{
    int p;  //根節點
    int l;  //左節點
    int r;  //右節點
}T[Max];

//前序遍歷
void Pre(int u)
{
    if(u == NIL)
        return ;
    printf(" %d",u);  //根節點
    Pre(T[u].l);   //左子樹
    Pre(T[u].r);   //右子樹
}
//中序遍歷
void In(int u)
{
    if(u == NIL)
        return ;
    In(T[u].l);   //左
    printf(" %d",u);  //根
    In(T[u].r);    //右
}
//後序遍歷
void Pos(int u)
{
    if(u == NIL)
        return ;
    Pos(T[u].l);   //左
    Pos(T[u].r);   //右
    printf(" %d",u);   //根
}
int main()
{
    int i;
    int v,l,r,root;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        T[i].p = NIL;//節點初始化每個節點單獨存在
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d",&v,&l,&r); //輸入節點,該節點的左節點,右節點
        //構造樹
        T[v].l = l;  //v 節點的左節點 = l
        T[v].r = r;  //v節點的右節點 = r
        if(l != NIL)  //左節點存在
            T[l].p = v;  //更新根節點
        if(r != NIL)  //右節點存在
            T[r].p = v;  //同理
    }
    for(i=0;i<n;i++)
        if(T[i].p == NIL)  //
            root = i;
    //前序
    printf("Preorder\n");
    Pre(root);
    printf("\n");
    //中序
    printf("Inorder\n");
    In(root);
    printf("\n");
    //後序
    printf("Postorder\n");
    Pos(root);
    printf("\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章