描述
树的遍历即给出一个指向树的指针,访问树中的每一个节点。树的遍历有三种基本遍历方式,分别是前序(preorder)、中序(inorder)、后序(postorder)。
递归实现
原理
- 前序(preorder):先访问节点,然后访问该节点的左子树和右子树;
- 中序(inorder) : 先访问该节点的左子树,然后访问该节点,再访问该节点的右子树;
- 后序( postorder) : 先访问该节点的左子树和右子树,然后访问该节点。
代码实现
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElementType;
typedef int Status;
int index = 0;
char str[] = "ABDH#K###E##CFI###G#J##";
typedef struct TreeNode
{
ElementType data;
struct TreeNode *Left;
struct TreeNode *Right;
}TreeNode, *pTree;
Status InitTree(pTree *T)
{
*T = NULL;
return OK;
}
Status Visit(pTree T)
{
if(T == NULL)
return ERROR;
printf("%c ",T->data);
return OK;
}
void DeleteTree(pTree *T)
{
if(*T)
{
if((*T)->Left)
DeleteTree(&(*T)->Left);
if((*T)->Right)
DeleteTree(&(*T)->Right);
free(*T);
*T = NULL;
}
}
void CreateTree(pTree *T)
{
ElementType ch;
ch = str[index++];
if(ch == '#')
*T = NULL;
else
{
*T = (pTree)malloc(sizeof(TreeNode));
if((*T) == NULL)
exit(0);
(*T)->data = ch;
CreateTree(&(*T)->Left);
CreateTree(&(*T)->Right);
}
}
int TreeDepth(pTree T)
{
int Ldepth, Rdepth;
if(T == NULL)
return -1;
if(T->Left)
Ldepth = TreeDepth(T->Left);
else
Ldepth = 0;
if(T->Right)
Rdepth = TreeDepth(T->Right);
else
Rdepth = 0;
return (Ldepth > Rdepth)? Ldepth + 1 : Rdepth + 1;
}
int TreeNodeCount(pTree T)
{
if( T == NULL)
return 0;
return TreeNodeCount(T->Left) + TreeNodeCount(T->Right) + 1;
}
int TreeIsEmpty(pTree T)
{
if(T)
return FALSE;
else
return TRUE;
}
void PreorderTraverse(pTree T, Status (*Visit)(pTree))
{
if(T == NULL)
return;
(*Visit)(T);
//printf("%c ",T->data);
PreorderTraverse(T->Left,Visit);
PreorderTraverse(T->Right,Visit);
}
void InorderTraverse(pTree T, Status (*Vistit)(pTree))
{
if(T == NULL)
return;
InorderTraverse(T->Left,Visit);
(*Visit)(T);
InorderTraverse(T->Right,Visit);
}
void PostorderTraverse(pTree T, Status (*Visit)(pTree))
{
if(T == NULL)
return;
PostorderTraverse(T->Left,Visit);
PostorderTraverse(T->Right,Visit);
(*Visit)(T);
}
int main()
{
pTree Tree;
InitTree(&Tree);
CreateTree(&Tree);
printf("Tree's Depth is %d\n",TreeDepth(Tree));
printf("Tree's Node number is %d\n",TreeNodeCount(Tree));
if(TreeIsEmpty(Tree))
{
printf("Tree is Empty\n");
}
printf("PreorderTraverse is :");
PreorderTraverse(Tree,Visit);
printf("\n");
printf("InorderTraverse is :");
InorderTraverse(Tree,Visit);
printf("\n");
printf("PostorderTraverse is :");
PostorderTraverse(Tree,Visit);
printf("\n");
DeleteTree(&Tree);
if(TreeIsEmpty(Tree))
{
printf("Tree is Delte and Empty\n");
}
return 0;
}