/*
2013年3月25日 22:17:47 xulei
二叉树的遍历分为三种:
先序遍历(DLR): 先访问根节点, 再访问左节点, 最后访问右节点
中序遍历(LDR): 先访问左节点, 再访问根节点, 最后访问右节点
后序遍历(LRD): 先访问左节点, 再访问右节点, 最后访问根节点
*/
#include <stdio.h>
#include <malloc.h>
struct BiTreeNode
{
char data; // 数据域, 假设为char
struct BiTreeNode * Lchild; // 左节点
struct BiTreeNode * Rchild; // 右节点
};
//先序遍历(DLR):
int PreOrder(struct BiTreeNode *p);
//中序遍历(LDR):
int InOrder(struct BiTreeNode *p);
//后序遍历(LRD):
int PostOrder(struct BiTreeNode *p);
// 静态创建一个二叉树
struct BiTreeNode * CreateTree();
int main(int argc, char **argv)
{
struct BiTreeNode *tree = CreateTree();
PreOrder(tree);
printf("\n");
InOrder(tree);
printf("\n");
PostOrder(tree);
printf("\n");
return 0;
}
int PreOrder(struct BiTreeNode *p)
{
if (p != NULL)
{
printf("%c ", p->data); // 先对数据域操作
PreOrder(p->Lchild); // 再遍历左节点
PreOrder(p->Rchild); // 最后遍历右节点
}
return 0;
}
//中序遍历(LDR):
int InOrder(struct BiTreeNode *p)
{
if (p != NULL)
{
InOrder(p->Lchild); // 先遍历左节点
printf("%c ", p->data); // 再对数据域操作
InOrder(p->Rchild); // 最后遍历右节点
}
return 0;
}
//后序遍历(LRD):
int PostOrder(struct BiTreeNode *p)
{
if (p != NULL)
{
PostOrder(p->Lchild); // 先遍历左节点
PostOrder(p->Rchild); // 后遍历右节点
printf("%c ", p->data); // 最后对数据域操作
}
return 0;
}
// 静态创建一个二叉树
struct BiTreeNode * CreateTree()
{
struct BiTreeNode *A = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *B = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *C = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *D = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *E = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *F = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *G = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
struct BiTreeNode *H = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
A->data = 'A'; // A
A->Rchild = C; // / \
A->Lchild = B; // B C
B->data = 'B'; // \ \
B->Rchild = D; // D E
B->Lchild = NULL; // / \ \
C->data = 'C'; // F G H
C->Rchild = E; //
C->Lchild = NULL; //
D->data = 'D'; //
D->Rchild = G; //
D->Lchild = F; //
E->data = 'E'; //
E->Rchild = H; //
E->Lchild = NULL; //
F->data = 'F'; //
F->Rchild = F->Lchild = NULL; //
G->data = 'G';
G->Lchild = G->Rchild = NULL;
H->data = 'H';
H->Rchild = H->Lchild = NULL;
return A;
}