码迷,mamicode.com
首页 > 其他好文 > 详细

(原)数据结构——线索二叉树

时间:2015-08-09 20:31:23      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

  原文地址: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!