樹的前序,中序,後序遍曆(遞迴),遞迴
描述
樹的遍曆即給出一個指向樹的指標,訪問樹中的每一個節點。樹的遍曆有三種基本遍曆方式,分別是前序(preorder)、中序(inorder)、後序(postorder)。
遞迴實現
原理
代碼實現
#include <stdlib.h>#include <stdio.h>#include <string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef 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;}