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

     来源: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! ");

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

        printf(
    " ");
    }
    复制代码
  • 相关阅读:
    mysql六:数据备份、pymysql模块
    mysql五:索引原理与慢查询优化
    mysql四:数据操作
    sql查询作业答案
    mysql四-2:多表查询
    mysql四-1:单表查询
    mysql五补充部分:SQL逻辑查询语句执行顺序
    mysql三-3:完整性约束
    mysql三:表操作
    mysql三-2:数据类型
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3292440.html
Copyright © 2011-2022 走看看