zoukankan      html  css  js  c++  java
  • 线索二叉树的构建和遍历------小甲鱼数据结构和算法

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef char ElemType;
    
    // 线索存储标志位
    // Link(0):表示指向左右孩子的指针
    // Thread(1):表示指向前驱后继的线索
    typedef enum {Link, Thread} PointerTag;
    
    
    
    typedef struct BiThrNode
    {
        char data;
        struct BiThrNode *lchild,*rchild;
        PointerTag ltag;
        PointerTag rtag;
    } BiThrNode,*BiThrTree;
    
    
    // 定义一个全局变量表示刚刚走过的节点
    BiThrTree pre;
    
    // 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
    void CreateBiThrTree(BiThrTree *T) {
        char c;
        scanf("%c",&c);
    
        if ( ' ' == c ){
            *T = NULL;
        }else {
            *T = (BiThrNode *)malloc(sizeof(BiThrNode));
            (*T)->data = c;
            (*T)->ltag = Link;
            (*T)->rtag = Link;
    
            CreateBiThrTree(&(*T)->lchild);
            CreateBiThrTree(&(*T)->rchild);
        }
    }
    
    // 中序遍历线索化
    
    void InThreading(BiThrTree T){
        if ( T ) {
            InThreading(T->lchild);  // 递归左孩子线索化
    
            if( !T->lchild ){
                T->ltag = Thread;
                T->lchild = pre;
            }
            if ( !pre->rchild ){
                pre->rtag = Thread;
                pre->rchild = T;
            }
            pre = T;
            InThreading(T->rchild);  // 递归右孩子线索化
        }
    }
    
    // 初始化一个头指针
    void InOrderThreading( BiThrTree *p, BiThrTree T){
        *p = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*p)->ltag = Link;
        (*p)->rtag = Link;
        (*p)->rchild = *p;
        if (!T) {
            (*p)->lchild = *p;
        }else {
            (*p)->lchild = T;
            pre = *p;
            InThreading(T);
            pre->rchild = *p;
            pre->rtag = Thread;
            (*p)->rchild = pre;
        }
    }
    
    void visit (char c){
        printf("%c",c);
    }
    // 中序遍历二叉树,迭代
    void InOrderTraverse( BiThrTree T ) {
        BiThrTree p;
        p = T->lchild;
    
        while( p!=T ){
            while( p->ltag == Link ){
                p = p->lchild;
            }
            visit(p->data);
    
            while( p->rtag == Thread && p->rchild !=T ){
                p = p->rchild;
                visit(p->data);
            }
            p = p->rchild;
        }
    
    
    }
    int main()
    {
        BiThrTree P,T = NULL;
    
        CreateBiThrTree( &T );
    
        InOrderThreading( &P, T );
    
        printf("中序遍历二叉树的结果为:");
    
        InOrderTraverse( P );
    
        printf("
    ");
    
        return 0;
    }

    运行截图

  • 相关阅读:
    OpenGL ES学习001---绘制三角形
    Mac关机时处于黑屏状态
    静态变量和实例变量的区别(配图解释专业术语,通俗易懂)
    用shape画内圆外方,形成一个圆形头像
    最全的敏捷认证对比(CSM/PMI-ACP/EXIN)
    Certified Scrum Master CSM 中文资料大全
    如何打造优秀的远程敏捷团队(9步)
    博客搬家
    权威的国际敏捷认证Certified Scrum Master (CSM)
    博客园入驻了
  • 原文地址:https://www.cnblogs.com/ncuhwxiong/p/7236892.html
Copyright © 2011-2022 走看看