zoukankan      html  css  js  c++  java
  • 中序线索化二叉树

          这个代码其实自己花了很长的时间去理解,渐渐的有所明白了一点。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef  enum { Link , Thread } PointTag;    //Link表示指针,Thread表示线索
    
    typedef struct treenode                                //树的节点定义
    {
        int data ;
        struct treenode * leftchild , * rightchild ;
        PointTag leftTag , rightTag ;
    } TreeNode ;
    
    
    TreeNode * CreactTree()                         //建立树
    {
        TreeNode * T ;
        int data ;
        scanf("%d" , & data);
    
        if(0 == data)
        {
            T = NULL ;
        }
        else
        {
            T = (TreeNode *)malloc(sizeof(TreeNode)) ;
            T->data = data ;
            T->leftchild = CreactTree() ;
            T->rightchild = CreactTree() ;
        }
    
        return(T) ;
    }
    
    void InThreading(TreeNode * T,TreeNode **pre)     //中序遍历线索化
    {
        TreeNode * p ;
        p = T ;
    
        if(NULL != p)
        {
            InThreading(p->leftchild,pre) ;
    
            if(NULL == p->leftchild)
            {
                p->leftchild =(*pre);
                p->leftTag = Thread ;
            }
            else
            {
                p->leftTag = Link ;
            }
    
            if(NULL == (*pre)->rightchild)
            {
               (*pre)->rightchild = p ;
                (*pre)->rightTag = Thread ;
            }
            else
            {
                (*pre)->rightTag = Link ;
            }
    
           (*pre) = p ;
            InThreading(p->rightchild,pre) ;
        }
    }
    
    TreeNode * InOrdetThreading(TreeNode * T)      //中序线索化二叉树
    {
        TreeNode * Thrt , * * pre;
        pre = (TreeNode * *)malloc(sizeof(TreeNode *)) ;  //用来传递前一个位置指针
        (* pre) = (TreeNode *)malloc(sizeof(TreeNode)) ;
        Thrt = (TreeNode *)malloc(sizeof(TreeNode)) ;  // 建立一个新的头节点
        Thrt->leftchild = T ;
        Thrt->rightchild = Thrt ;
        (*pre) = Thrt ;
        InThreading(T,pre) ;      //中序遍历并线索化
        (*pre)->rightchild = Thrt ;
       (*pre)->rightTag = Thread ;
        Thrt->rightchild =(*pre) ;
        return(Thrt) ;
    }
    
    void InTravel(TreeNode * Thrt)
    {
        TreeNode * p ;
        p = Thrt->leftchild ;
    
        while(p != Thrt)
        {
            while(Link == p->leftTag)
                p = p->leftchild ;
    
            printf("%d    " , p->data) ;
    
            while(Thread == p->rightTag && Thrt != p->rightchild)
            {
                p = p->rightchild ;
                printf("%d    " , p->data) ;
            }
    
            p = p->rightchild ;
        }
    }
    
    int main()
    {
        TreeNode * T , * Thrt ;
        T = CreactTree() ;
        Thrt = InOrdetThreading(T) ;
        InTravel(Thrt) ;
        return 0 ;
    }
  • 相关阅读:
    《测试工作量的时间评估》方案梳理
    GitHub 生成密钥
    Jenkins+Jmeter持续集成(五、Ant+GitLab持续构建)
    Linux下查看文件和文件夹大小
    Java Runtime.exec()的使用
    如何启动/停止/重启MySQL
    浅析Java语言慢的原因
    chattr命令锁定账户敏感文件
    SOAP协议初级指南 (三)
    SOAP协议初级指南 (二)
  • 原文地址:https://www.cnblogs.com/fengxmx/p/3710451.html
Copyright © 2011-2022 走看看