樹的前序,中序,後序遍曆(遞迴),遞迴

來源:互聯網
上載者:User

樹的前序,中序,後序遍曆(遞迴),遞迴
描述

樹的遍曆即給出一個指向樹的指標,訪問樹中的每一個節點。樹的遍曆有三種基本遍曆方式,分別是前序(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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.