`

二叉树的二叉线索存储

阅读更多
 /* c6-3.h 二叉树的二叉线索存储表示 */
 typedef enum{Link,Thread}PointerTag; /* Link(0):指针,Thread(1):线索 */
 typedef struct BiThrNode
 {
   TElemType data;
   struct BiThrNode *lchild,*rchild; /* 左右孩子指针 */
   PointerTag LTag,RTag; /* 左右标志 */
 }BiThrNode,*BiThrTree;

 

 /* bo6-3.c 二叉树的二叉线索存储(存储结构由c6-3.h定义)的基本操作 */
 Status CreateBiThrTree(BiThrTree *T)
 { /* 按先序输入二叉线索树中结点的值,构造二叉线索树T */
   /* 0(整型)/空格(字符型)表示空结点 */
   TElemType h;
 #if CHAR
   scanf("%c",&h);
 #else
   scanf("%d",&h);
 #endif
   if(h==Nil)
     *T=NULL;
   else
   {
     *T=(BiThrTree)malloc(sizeof(BiThrNode));
     if(!*T)
       exit(OVERFLOW);
     (*T)->data=h; /* 生成根结点(先序) */
     CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */
     if((*T)->lchild) /* 有左孩子 */
       (*T)->LTag=Link;
     CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */
     if((*T)->rchild) /* 有右孩子 */
       (*T)->RTag=Link;
   }
   return OK;
 }

 BiThrTree pre; /* 全局变量,始终指向刚刚访问过的结点 */
 void InThreading(BiThrTree p)
 { /* 中序遍历进行中序线索化。算法6.7 */
   if(p)
   {
     InThreading(p->lchild); /* 递归左子树线索化 */
     if(!p->lchild) /* 没有左孩子 */
     {
       p->LTag=Thread; /* 前驱线索 */
       p->lchild=pre; /* 左孩子指针指向前驱 */
     }
     if(!pre->rchild) /* 前驱没有右孩子 */
     {
       pre->RTag=Thread; /* 后继线索 */
       pre->rchild=p; /* 前驱右孩子指针指向后继(当前结点p) */
     }
     pre=p; /* 保持pre指向p的前驱 */
     InThreading(p->rchild); /* 递归右子树线索化 */
   }
 }

 Status InOrderThreading(BiThrTree *Thrt,BiThrTree T)
 { /* 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。算法6.6 */
   *Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
   if(!*Thrt)
     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;
 }

 Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType))
 { /* 中序遍历二叉线索树T(头结点)的非递归算法。算法6.5 */
   BiThrTree p;
   p=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;
 }

 

 /* main6-3.c 检验bo6-3.c的主程序 */
 #define CHAR 1 /* 字符型 */
 /*#define CHAR 0 /* 整型(二者选一) */
 #if CHAR
   typedef char TElemType;
   TElemType Nil=' '; /* 字符型以空格符为空 */
 #else
   typedef int TElemType;
   TElemType Nil=0; /* 整型以0为空 */
 #endif
 #include"c1.h"
 #include"c6-3.h"
 #include"bo6-3.c"

 Status vi(TElemType c)
 {
 #if CHAR
   printf("%c ",c);
 #else
   printf("%d ",c);
 #endif
   return OK;
 }

 void main()
 {
   BiThrTree H,T;
 #if CHAR
   printf("请按先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n");
 #else
   printf("请按先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n");
 #endif
   CreateBiThrTree(&T); /* 按先序产生二叉树 */
   InOrderThreading(&H,T); /* 中序遍历,并中序线索化二叉树 */
   printf("中序遍历(输出)二叉线索树:\n");
   InOrderTraverse_Thr(H,vi); /* 中序遍历(输出)二叉线索树 */
   printf("\n");
 }

 

分享到:
评论

相关推荐

    C++数据结构-二叉树和线索二叉树

    实现了二叉树的多种操作:添加、删除、拷贝、清空、树深度计算、父节点、兄弟节点获取、先中后序递归及非遍历、按层次遍历、中序迭代器(非递归算法)、节点查找、先序和中序序列重建二叉树、数组和二叉链表存储结构...

    数据结构5.10二叉树线索链表存储结构

    ### 数据结构5.10二叉树线索链表存储结构 #### 一、知识点概述 在数据结构的学习中,二叉树是一种非常重要的非线性数据结构,它具有丰富的应用场景和变化形式。其中,二叉树的线索链表存储结构是通过对二叉树的...

    二叉树的线索化实现

    4. **应用**:线索二叉树的主要应用场景在于高效地进行特定顺序的遍历,如中序遍历,尤其在没有额外存储空间(如栈或队列)时,线索二叉树能提供便利。此外,线索化二叉树也可以用于实现自平衡二叉查找树,如AVL树和...

    二叉树转化为前序线索树

    1. **线索二叉树的定义**:线索二叉树是在二叉链表的基础上增加两个线索,分别指向当前节点在前序遍历中的前一个节点(left-thr)和后一个节点(right-thr)。这样,即使在非递归情况下,也可以按照前序遍历的顺序...

    C++线索二叉树类实现

    线索二叉树是一种特殊的二叉树结构,它在二叉链表的基础上增加了线索,以便于在非递归情况下进行前序、中序和后序遍历。在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树...

    线索二叉树的存储结构、线索化和遍历

    线索二叉树的存储结构、线索化和遍历,其中的代码很不错

    数据结构二叉树的线索本.ppt

    在二叉链表的存储结构中,通常只能获取结点的左右孩子信息,而线索二叉树通过利用空指针域存储额外的线索信息,使得在静态结构中也能获取到动态遍历过程中的前驱和后继。 **线索的定义**: 线索是在二叉链表的结点...

    算法-理论基础- 二叉树- 线索链表(包含源程序).rar

    线索链表是二叉树的一种存储方式,尤其在遍历和查找操作中非常实用。本文将深入探讨二叉树的基本概念、线索单链表的概念以及如何通过源程序实现线索链表。 首先,我们要理解什么是二叉树。二叉树是一种特殊的树形...

    线索二叉树

    线索二叉树是一种特殊的二叉树数据结构,它在二叉链表的基础上增加了线索,用于在非递归情况下实现前序、中序和后序遍历。这种数据结构在计算机科学中尤其在算法设计和数据结构课程中占有重要地位。在C++中实现线索...

    西南交通大学-数据结构第4次作业

    (2) 用先序遍历法建立二叉树二叉链表存储结构(结点数据域类型为char,输入字符序列用字符'#'表示NULL),实现中序线索化,并用非递归算法输出中序遍历结果的正序和逆序序列。 二、图 1. 已知某无向图如下图所示。画出...

    数据结构课程设计线索二叉树

    在线索二叉树中,我们增加了两个额外的标志位,用于存储前驱和后继的信息。这样,每个节点不仅指向它的左孩子和右孩子,还可以通过线索找到它的前一个节点和后一个节点。 需求分析: 在进行数据结构课程设计时,...

    数据结构线索二叉树严蔚敏

    在众多的数据结构类型中,线索二叉树是一种特殊形式的二叉搜索树,主要用于提高对二叉树的遍历效率,特别是对于查找前驱和后继节点。这个主题与严蔚敏教授的教材《数据结构》紧密相关,这是一本在中国计算机科学教育...

    线索二叉树 算法 建立 输出等。。。

    线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在不使用额外栈或递归的情况下实现前序、中序和后序遍历。这种数据结构在处理大规模数据时非常有用,因为它可以提高查找效率。下面我们将...

    第7章树和二叉树第9讲- 线索二叉树.pptx

    CreatThread 算法是对以二叉链存储的二叉树 b 进行中序线索化,并返回线索化后头结点的指针 root。Thread 算法是对以 p 为根结点的二叉树子树的中序线索化。 线索二叉树的优点是可以提高遍历二叉树的效率,並且可以...

    线索二叉树运算的课程设计

    线索二叉树是一种特殊的二叉树数据结构,它通过在二叉链表的空指针域中存储指向结点在特定遍历顺序下的前驱和后继结点的指针,从而方便快速的遍历。在本课程设计中,重点在于实现中序线索二叉树的建立、插入、删除...

    数据结构 线索二叉树

    线索二叉树是一种特殊的二叉树,它是在普通的二叉链表基础上进行改造,以便在二叉树中方便地进行前序、中序和后序遍历。在标准的二叉链表中,每个节点仅包含指向左孩子和右孩子的指针,但没有直接指向其前驱和后继...

    线索二叉树详解(C语言版).rar

    线索二叉树是在普通二叉链表的基础上,为每个节点增加两个线索(thread),分别指向其前驱和后继。这样,在二叉树中可以按照链表的方式进行双向遍历。线索二叉树分为两种类型:前序线索二叉树、中序线索二叉树,分别...

    线索二叉树的插入,删除

    线索二叉树是一种特殊的二叉树数据结构,它在二叉链表的基础上增加了线索,用于在非递归情况下实现二叉树的前序、中序和后序遍历。这种数据结构在解决某些特定问题时非常有用,比如快速查找、遍历等。接下来我们将...

Global site tag (gtag.js) - Google Analytics