线索二叉树

简介:

 

 来源:http://www.cnblogs.com/JCSU/articles/2005967.html

复制代码
复制代码
/* ******************************************************************************
/* <PRE>
/* 版权所有    : -
/* 模块名      : 树
/* 文件名      : biThrTree.cpp
/* 功能描述    : 线索二叉树的表示与实现
/* 作者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 备注        : 输入示例与输出结果
/* 
/* e.g. input  : ABD###CE#F###
/* bi-tree     :
/*                 A
/*                / \
/*               B   C
/*              /   /
/*             D   E
/*                  \
/*                   F
/* 
/* inorder thread traverse: D B A E F C
/* -----------------------------------------------------------------------------
/* 修改记录    :
/* 日 期        版本     修改人        修改内容
/* 2011/01/01   1.0      <xxx>         创建
/* </PRE>
******************************************************************************
*/
#include 
< stdio.h >
#include 
< stdlib.h >

/* *****************************************************************************
/* 数据类型和常量定义
/*****************************************************************************
*/
#define  OK           1
#define  ERROR        0
#define  OVERFLOW    -2

typedef 
int  Status;
typedef 
int  TElemType;

/*  二叉树的二叉线索存储表示  */
typedef 
enum  PointerTag { Link, Thread };  /*  Link==0: 指针, Thread==1: 线索  */


/* *****************************************************************************
/* 数据结构定义
/*****************************************************************************
*/
typedef 
struct  BiThrNode {
    TElemType data;
    
struct  BiThrNode  * lchild,  * rchild;  /*  左右孩子指针  */
    PointerTag LTag, RTag;             
/*  左右标志  */
} BiThrNode, 
* BiThrTree;


/* *****************************************************************************
/* 全局变量声明
/*****************************************************************************
*/
static  BiThrNode  * pre  =  NULL;  // 保存线索化过程中的前驱结点


/* *****************************************************************************
/* 函数原型声明
/*****************************************************************************
*/
void  InThreading(BiThrTree p);


/* ******************************************************************************
/* <FUNC>
/* 函数名   : Visit
/* 功能     : 打印节点数据
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status Visit(TElemType e)
{
    printf(
" %c " , e);
    
return  OK;
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : InOrderTraverse_Thr
/* 功能     : 中序遍历二叉线索树
/* 参数     : -
/* 返回值   : -
/* 备注     : 中序遍历二叉线索树T的非递归算法, T指向头结点, 头结点的左链lchild指向根结点
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InOrderTraverse_Thr(BiThrTree T, Status (
* Visit)(TElemType e)) {
    BiThrNode 
* =  T -> lchild;           // p指向根结点
     while  (p  !=  T) {                    // 空树或遍历结束时, p==T
         while  (p -> LTag  ==  Link) p  =  p -> lchild;
        
if  ( ! Visit(p -> data))  return  ERROR;  // 访问其左子树为空的结点
         while  (p -> RTag  ==  Thread  &&  p -> rchild  !=  T) {
            p 
=  p -> rchild; Visit(p -> data);   // 访问后续结点
        }
        p 
=  p -> rchild;
    }
    
return  OK;
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : InOrderThreading
/* 功能     : 中序线索化二叉树
/* 参数     : -
/* 返回值   : -
/* 备注     : 中序遍历二叉树T, 并将其中序线索化, Thrt指向头结点
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InOrderThreading(BiThrTree 
& Thrt, BiThrTree T) {
    
if  ( ! (Thrt  =  (BiThrTree)malloc( sizeof (BiThrNode)))) exit(OVERFLOW);
    Thrt
-> LTag  =  Link; Thrt -> RTag  =  Thread;   // 建立头结点
    Thrt -> rchild  =  Thrt;                      // 右指针回指
     if  ( ! T) Thrt -> lchild  =  Thrt;              // 右二叉树为空, 则左指针回指
     else  {
        Thrt
-> lchild  =  T; pre  =  Thrt;
        InThreading(T);                      
// 中序遍历进行中序线索化
        pre -> rchild  =  Thrt;  pre -> RTag  =  Thread;  // 最后一个结点线索化
        Thrt -> rchild  =  pre;
    }
    
return  OK;
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : InThreading
/* 功能     : 中序线索化
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void  InThreading(BiThrTree p) {
    
if  (p) {
        InThreading(p
-> lchild);   // 左子树线索化
         if  ( ! p -> lchild) { p -> LTag  =  Thread; p -> lchild  =  pre; }  // 前驱线索
         if  ( ! pre -> rchild) { pre -> RTag  =  Thread; pre -> rchild  =  p; }  // 后继线索
        pre  =  p;                    // 保持pre指向p的前驱
        InThreading(p -> rchild);   // 右子树线索化
    }
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : CreateBiTree
/* 功能     : 创建二叉树
/* 参数     : -
/* 返回值   : -
/* 备注     : 前序方式创建
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status CreateBiTree(BiThrTree 
& T)
{
    
char  ch  =  getchar();
    
if ( ' # '   ==  ch) T  =  NULL;
    
else  {
        
if ( ! (T  =  (BiThrNode  * )malloc( sizeof (BiThrNode)))) exit(OVERFLOW);
        T
-> data  =  ch;              // 生成根结点
        T -> LTag  =  Link;
        T
-> RTag  =  Link;
        CreateBiTree(T
-> lchild);   // 构造左子树
        CreateBiTree(T -> rchild);   // 构造右子树
    }
    
return  OK;
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : main
/* 功能     : 测试函数
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void  main()
{
    BiThrTree ThrT 
=  NULL;    BiThrTree T  =  NULL;
    CreateBiTree(T);

    
// 中序遍历二叉树并线索化
     if  (OK  ==  InOrderThreading(ThrT, T)) printf( " InOrder Threading Finished!\n " );

    
// 中序遍历线索二叉树
    printf( " InOrder Thread Traverse:  " );
    InOrderTraverse_Thr(ThrT, Visit);

    printf(
" \n " );
}
复制代码
复制代码




目录
相关文章
|
6月前
|
存储 C++
非递归遍历二叉树
非递归遍历二叉树
34 0
|
8月前
|
存储
线索化二叉树
线索化二叉树
36 0
二叉树的前序、中序和后序遍历
二叉树的前序、中序和后序遍历
层序遍历、遍历二叉树的应用
层序遍历、遍历二叉树的应用
|
存储 Java
线索二叉树
线索二叉树在二叉树的结点上加上线索的二叉树称为线索二叉树。
104 0
【C++】二叉树的遍历:前序、中序、后序、层序
【C++】二叉树的遍历:前序、中序、后序、层序
【C++】二叉树的遍历:前序、中序、后序、层序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
二叉树前序非递归遍历
二叉树前序非递归遍历 二叉树前序非递归遍历
90 0
二叉树中序非递归遍历
二叉树中序非递归遍历 二叉树中序非递归遍历
100 0