前序遍历:根结点->左子树->右子树(DLR)
中序遍历:左子树->根结点->右子树(LDR)
后序遍历:左子树->右子树->根结点(LRD)
对于前序遍历,先访问根结点,再按前序遍历访问左子树,最后按前序遍历访问右子树。其他同理。
#include <stdio.h>
#include <stdlib.h>
typedef int DATA;
typedef struct BinaryTreeNodeTag
{
struct BinaryTreeNodeTag*lChild;
struct BinaryTreeNodeTag*rChild;
DATA data;
}BiTreeNode;
void visitNode(BiTreeNode* node)
{
printf("%d ", node->data);
}
void preVisit(BiTreeNode* root)
{
if ( root )
{
visitNode(root);
preVisit(root->lChild);
preVisit(root->rChild);
}
}
#define ARRAY_NUM(array) (sizeof(array)/sizeof(array[0]))
int main(void)
{
BiTreeNode tree[7];
int i;
for ( i = 0; i < ARRAY_NUM(tree); i++ )
{
tree[i].lChild = NULL;
tree[i].rChild = NULL;
tree[i].data = i;
if ( 2*i+1 < ARRAY_NUM(tree) )
{
tree[i].lChild = &tree[2*i+1];
}
if ( 2*i+2 < ARRAY_NUM(tree) )
{
tree[i].rChild = &tree[2*i+2];
}
}
preVisit(&tree[0]);
}