标签:
原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html
转载务必注明出处!
线索二叉树的思想来源于二叉树的存储结构中,存在一些空的指针域,因此是否能够将这些空间利用起来,存储一些关于节点间先后顺序的信息,由此产生了线索二叉树。线索二叉树中,线索反映前驱、后继的关系,而指针则体现左右子树。
以二叉链表为例,线索二叉树存储结构上的特点是添加标识符,表明左右指针域究竟存的是指向前驱和后继的线索,还是指向左右子树的指针;
线索二叉树的优势是一旦对一棵二叉树建立了相应的线索结构,当以后使用特定的方式遍历这课树时,可以避免递归方式和非递归方式(利用栈)带来的空间开销。
构建和遍历线索二叉树的思路如下:
这里以带线索的二叉链表方式作为存储结构,先序创建一棵二叉树,然后中序线索化这棵二叉树,得到的是一棵中序线索二叉树,此后再中序遍历该二叉树,就可以使用这里的线索信息,不用额外的栈空间。
原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html
转载务必注明出处!
该例子共包括一个.h文件和一个.c文件
biThrTree.h的存储结构
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int Status; typedef char TElemType; typedef enum {Link, Thread} PointerTag; typedef struct BiThrNode{ TElemType data; PointerTag LTag, RTag; struct BiThrNode *lchild, *rchild; }BiThrNode, *BiThrTree; BiThrTree pre = NULL; // global variable stores the previous node
biThrTree.h的遍历操作
我们定义一个最简单的遍历操作,作为示意,仅仅打出被遍历元素中包含的数据
Status PrintElement(TElemType e){ printf("%c", e); return OK; }
biThrTree.h,先序创建二叉树
创建二叉树可以以任何顺序,这里以先序创建为例
BiThrTree CreateBiThrTree() { TElemType ch; BiThrTree T; scanf("%c", &ch); getchar(); if (ch == ‘$‘) T = NULL; else{ T = (BiThrTree)malloc(sizeof(BiThrNode)); if(!T) exit(OVERFLOW); T->data = ch; printf("Input lchild of %c:\n", ch); T->lchild = CreateBiThrTree(); printf("Input rchild of %c:\n", ch); T->rchild = CreateBiThrTree(); } return T; }
biThrTree.h,中序线索化已经创建的二叉树
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; InThreading(p->rchild); } } Status InOrderThreading(BiThrTree *Thrt, BiThrTree T){ (*Thrt) = (BiThrTree)malloc(sizeof(BiThrNode)); if(!(*Thrt)) exit(OVERFLOW); (*Thrt)->RTag = Thread; (*Thrt)->rchild = *Thrt; (*Thrt)->LTag = Link; if(!T) (*Thrt)->lchild = *Thrt; else{ (*Thrt)->lchild = T; pre = *Thrt; InThreading(T); pre->rchild = *Thrt; pre->RTag = Thread; (*Thrt)->rchild = pre; } return OK; }
biThrTree.h,中序遍历已经线索化的二叉树
Status InOrderTraverse_Thr( BiThrTree Thrt, Status (*Visit)(TElemType e)){ BiThrTree p; p = Thrt->lchild; while(p != Thrt){ while(p->LTag == Link) p = p->lchild; if(!(*Visit)(p->data)) return ERROR; while(p->RTag == Thread && p != Thrt){ p = p->rchild; (*Visit)(p->data); } if (p != Thrt) p = p->rchild; } return OK;
biThrTree.c,主程序进行功能测试
1 #include"biThrTree.h" 2 3 // 1. Create Binary Tree with Pre-Order input(Creation can be in any order) 4 // 2. In-Order Threading this tree (How to threading the tree depends on in what 5 // order you are goning to traverse the tree.) 6 // 3. then In-Order Traverse this tree 7 8 int main(int argc, char *argv[]){ 9 BiThrTree T, temp; 10 11 printf("Creating Binary Thread Tree.\n"); 12 T = CreateBiThrTree(); 13 if(!T) 14 return OVERFLOW; 15 printf("Binary Thread Tree Created.\n"); 16 17 if(!InOrderThreading(&temp, T)) 18 return ERROR; 19 20 printf("In Order Traversing the Binary Thread Tree:\n"); 21 if(!InOrderTraverse_Thr(temp, &PrintElement)) 22 return ERROR; 23 printf("\nIn Order Traversing Accomplished.\n"); 24 25 return OK; 26 }
标签:
原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html