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 ;
    }
  • 相关阅读:
    提升开发效率的十个工具
    JQuery常用函数及功能小结
    jquery-validation 学习总结
    JavaScript:避免代码的重复执行
    18 个最好的CSS框架用于提高开发效率
    如何书写高质量的jQuery代码
    13个 ASP.NET MVC 的扩展
    CSS_LESS 语法/函数详解
    21个值得收藏的Javascript技巧
    JQuery常用功能的性能优化
  • 原文地址:https://www.cnblogs.com/fengxmx/p/3710451.html
Copyright © 2011-2022 走看看