zoukankan      html  css  js  c++  java
  • 序言树,为了,序后,(递归)

    叙述性说明

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

    有三种基本遍历树遍历。每一个前导码(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; }

    执行结果

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

  • 相关阅读:
    Nuget常用命令(转)
    Core使用SAP Web Service
    jquery.dataTables动态列--转
    jqGrid随窗口大小变化自适应大小-转
    30个值得推荐的数据可视化工具--转
    Automapper问题记录
    MVC及MVC Core在filter中如何获取控制器名称和Action名称
    .Net Core使用 MiniProfiler 进行性能分析(转)
    Core中使用Hangfire
    ASP.NET 多环境下配置文件web.config的灵活配置---转
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4900874.html
Copyright © 2011-2022 走看看