前序遍歷(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;
}