zoukankan      html  css  js  c++  java
  • 线索二叉树【C语言】

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef  char ElemType;
    typedef  enum{Link,Thread} PointerTag; //Link为1,表示连接左孩子;Thread为0,表示连接前继项;
    
    //创建二叉树的结点;
    typedef struct BiThrNode
    {
        ElemType data;
        BiThrNode *lchild, *rchild;
        PointerTag ltag;
        PointerTag rtag;
    }BiThrNode, *BiThrTree;
    
    BiThrTree pre;        //设置一个全局变量,用来存储前继结点的信息;
    
    //创建二叉树,遵循前序遍历;
    int CreatBiThrTree(BiThrTree *T)
    {
        char c;
        scanf_s("%c", &c);
        if (' ' == c)
        {
            *T = NULL;
        }
        else
        {
            *T = (BiThrNode *)malloc(sizeof(BiThrNode));
            (*T)->data = c;
            (*T)->ltag = Link;
            (*T)->rtag = Link;
            CreatBiThrTree(&(*T)->lchild);   //采用递归,初始化左孩子,下同;
            CreatBiThrTree(&(*T)->rchild);
        }
        return 1;
    }
    
    //创建二叉树线索函数,遵循中序遍历;
    int BiThreading(BiThrTree T)
    {
        if (T)
        {
            BiThreading(T->lchild);
            if (!T->lchild)
            {
                T->ltag = Thread;
                T->lchild = pre;
            }
            if (!pre->rchild)
            {
                pre->rtag = Thread;
                pre->rchild = T;
            }
            pre = T;
            BiThreading(T->rchild);
        }
        return 1;
    }
    
    //创建头结点;
    int in_Threading(BiThrTree T, BiThrTree *p)
    {
        (*p) = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*p)->ltag = Link;
        (*p)->rtag = Thread;
        (*p)->rchild = *p;
        if (!T)
        {
            (*p)->lchild = *p;
        }
        else 
        {
            (*p)->lchild = T;  
            pre = *p;      //将创建的头结点p赋给pre;
            BiThreading(T);
            pre->rtag = Thread;  //进行收尾工作,形成一个类似于闭合的双向链表;
            pre->rchild = *p;
            (*p)->rchild = pre;
        }
        return 1;
    }
    
    //递归方法,二叉树前序遍历;
    int Pre_Order_Traverse(BiThrTree T, int level)
    {
        printf("递归前序遍历的结果为:
    ");
        if (!T)
        {
            return 0;
        }
        else
        {
            printf("第%d层:%c", level, T->data);
            Pre_Order_Traverse(T->lchild, level + 1);    //递归遍历左孩子,下同;
            Pre_Order_Traverse(T->rchild, level + 1);
        }
        return 1;
    }
    
    //非递归的方法,二叉树中序遍历,二叉树已存在头结点和线索;
    int In_Order_Traverse(BiThrTree T)
    {
        if (T)
        {
            BiThrTree P;
            P = T->lchild;
            while (P != T)
            {
                while (P->ltag == Link)
                {
                    P= P->lchild;
                }
                printf("%c/n", P->data);
                while (P->rtag == Thread&&P->rchild != T)
                {
                    P = P->rchild;
                    printf("%c/n", P->data);
                }
                P = P->rchild;
            }
        }
        return 1;
    }
    
    //主函数部分;
    int main()
    {
        int level = 1;
        BiThrTree T,p;
        CreatBiThrTree(&T);
        Pre_Order_Traverse(T, level);
        in_Threading(T, &p);
        In_Order_Traverse(T);
    }
  • 相关阅读:
    c# list排序的三种实现方式 (转帖)
    LINQ TO SQL 中的join(转帖)
    Linq to sql 增删改查(转帖)
    DBLinq (MySQL exactly) Linq To MySql
    github
    eclipse安装github插件egit
    Android中图片的目录
    Fragment
    世界500强榜单出炉:中国公司首进三强 沃尔玛居首
    经济学,不会挣钱,更不会赚钱
  • 原文地址:https://www.cnblogs.com/code-wangjun/p/4637793.html
Copyright © 2011-2022 走看看