二叉樹的遍歷有三種方式:前序遍歷(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); //最後遍歷根結點
}