数据结构-二叉树(2)

来源:互联网 发布:java 非web工程 log4j 编辑:程序博客网 时间:2024/05/30 23:39

二叉树的遍历和线索化

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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办 尿液浑浊气味重怎么办 经常便秘肚子胀怎么办 顺产满月后腰疼怎么办 化验尿蛋白质高怎么办 小孩子反复蛋白尿怎么办呢? 肾上张了个囊肿怎么办 同床后出血怎么办 药物引起胃不适怎么办