数据结构-二叉树(2)

二叉树的遍历和线索化

1、  层次遍历(使用到了队列)

2、  前序遍历(使用递归或不使用递归)

3、  中序遍历(使用递归或不使用递归)

4、  后序遍历(使用递归或不使用递归)

5、  中序线索二叉树

当以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而不能直接找到结点在遍历中的前驱和后继信息。要得到这些信息可采用一下两种方法:第一种方法是将二叉树遍历一遍,在遍历过程中可得到结点的前驱和后继,但这种动态访问浪费时间;第二种方法是充分利用二叉链表中的空链域,将遍历过程中结点的前驱、后继信息保存下来。

在有n个结点的二叉链表中共有2n个链域,但只有n-1个有用的非空链域,其余的n+1个链域是空的。我们可以利用剩下的n+1个空链域存放遍历过程中结点的前驱和后继信息。现规定:若结点有左子树,则其LChild域指向其左孩子,否则LChild域指向其前驱结点;如结点有右子树,则其RChild域指向其右孩子,否则RChild域指向其后继结点。

指向前驱和后继结点的指针叫做线索。以这种结构组成的二叉链表作为二叉树的存储结构,叫做线索链表。



#include <iostream>
#include <malloc.h>

using namespace std;

typedef enum{LINK,THREAD} PointerTag;
typedef enum{LINK1,THREAD1} PTag;
typedef int DataType;
typedef struct BTrTree{
    PointerTag lTag,rTag;
    int data;
    struct BTrTree *LChild,*RChild;
}BTreadNode,*BTreadTree;

BTreadTree createTreadTree(){
    BTreadTree root;
    int res = 0;
    scanf("%d",&res);
    if(res == 0){
        root = NULL;
    }else{
        root = (BTreadTree)malloc(sizeof(BTreadNode));
        root->data = res;
        root->lTag = LINK;
        root->rTag = LINK;
        printf("%d的左孩子:",root->data);
        root->LChild = createTreadTree();
        printf("%d的右孩子:",root->data);
        root->RChild = createTreadTree();
    }
    return root;
}
BTreadTree pre;
void initTread(BTreadTree root){
    BTreadTree p;
    p = root;
    if(p){
        initTread(p->LChild);
        if(!p->LChild){//左孩子是NULL
            p->lTag = THREAD;
            p->LChild = pre;
        }
        if(!pre->RChild){
           pre->rTag = THREAD;
           pre->RChild = p;
        }
        pre = p;
        initTread(p->RChild);
    }

}
//中序线索二叉树
BTreadTree inOrderThrTree(BTreadTree root){
    BTreadTree thr;//为头结点的的指针
    thr = (BTreadTree)malloc(sizeof(BTreadNode));
    thr->LChild = root;
    thr->RChild = thr;
    pre = thr;
    initTread(root);
    pre->rTag = THREAD;
    pre->RChild = thr;
    thr->RChild = pre;
    return thr;
}
//中序遍历线索二叉树
void inTreTravel(BTreadTree thr){
    BTreadTree p;
    p = thr->LChild;
    while(p!=thr){
        while(p->lTag == LINK){
            p = p->LChild;
        }
        printf("%d,",p->data);
        while(p->rTag == THREAD && p->RChild != thr){
            p = p->RChild;
            printf("%d,",p->data);
        }
        p = p->RChild;
    }
}
int main()
{
    BTreadTree  root, thr;
    printf("先序遍历方式创建二叉树:\n");
    root = createTreadTree();
    thr = inOrderThrTree(root);
    printf("中序遍历线索二叉树:\n");
    inTreTravel(thr);
    system("pause");

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值