序言树,为了,序后,(递归)

叙述性说明

遍历是给予一个指针的指针树的树,在树中访问的每个节点。

有三种基本遍历树遍历。每一个前导码(preorder)、为了(inorder)、后序(postorder)。

递归实现

原理

  1. 前序(preorder):先訪问节点。然后訪问该节点的左子树和右子树;
  2. 中序(inorder) : 先訪问该节点的左子树。然后訪问该节点。再訪问该节点的右子树;
  3. 后序( 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 ",TreeDepth(Tree)); printf("Tree's Node number is %d ",TreeNodeCount(Tree)); if(TreeIsEmpty(Tree)) { printf("Tree is Empty "); } printf("PreorderTraverse is :"); PreorderTraverse(Tree,Visit); printf(" "); printf("InorderTraverse is :"); InorderTraverse(Tree,Visit); printf(" "); printf("PostorderTraverse is :"); PostorderTraverse(Tree,Visit); printf(" "); DeleteTree(&Tree); if(TreeIsEmpty(Tree)) { printf("Tree is Delte and Empty "); } return 0; }

执行结果

版权声明:本文博主原创文章。博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4900874.html