码迷,mamicode.com
首页 > 其他好文 > 详细

中序线索化二叉树

时间:2014-05-07 09:07:36      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

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

bubuko.com,布布扣
#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 ;
}
bubuko.com,布布扣

 

中序线索化二叉树,布布扣,bubuko.com

中序线索化二叉树

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/fengxmx/p/3710451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!