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 ;
    }
  • 相关阅读:
    又发现新的QQ系统消息相关dll文件
    修改QQ版本号,解决QQ版本过低
    学DIV+CSS技术,如何入门?
    删除MSN广告及屏蔽MSN网页广告的方法
    制作网页需要掌握的几个基本技能
    陈晓薇的灿烂人生:比美丽更动人
    屏蔽QQ系统广播消息方法
    HTML结构化CSS网页布局入门指南
    Photoshop常用快捷键(逐步熟悉)
    如何去除视频上的水印?
  • 原文地址:https://www.cnblogs.com/fengxmx/p/3710451.html
Copyright © 2011-2022 走看看