• 线索二叉树


      1 #include<iostream>
      2 #include<cstdlib>
      3 #include<cstdio>
      4 #include<cstring>
      5 #include<malloc.h>
      6 using namespace std;
      7 
      8 typedef char ElemType; 
      9 
     10 //线索存储标志位
     11 //Link(0)表示指向左右孩子的指针
     12 //Thread(1)表示指向前驱后继的线索 
     13 typedef enum {
     14     Link,Thread
     15 }PointerTag;
     16 
     17 typedef struct BiThrNode{
     18     char data;
     19     struct BiThrNode *lchild,*rchild;
     20     PointerTag ltag;
     21     PointerTag rtag;
     22 }BiThrNode,*BiThrTree;
     23 
     24 //全局变零,始终指向刚刚访问过的结点
     25 BiThrTree pre;
     26 
     27 //创建一颗二叉树,用户遵照前序遍历输入数据
     28 void CreateBiThrTree(BiThrTree &T){
     29     char c;
     30     scanf("%c",&c);
     31     if(' ' == c)
     32         T = NULL;
     33     else{
     34         T = (BiThrNode *)malloc(sizeof(BiThrNode));
     35         T->data = c;
     36         T->ltag = Link;
     37         T->rtag = Link;
     38         CreateBiThrTree(T->lchild);
     39         CreateBiThrTree(T->rchild);
     40     }
     41 } 
     42 
     43 //中序遍历线索化
     44 void InThreading(BiThrTree &T){
     45     if(T){
     46         InThreading(T->lchild);//递归左孩子线索化
     47         if(!T->lchild){//如果该结点没有左孩子,设置ltag为Thread,并把lchid指向上一个刚刚访问的结点 
     48             T->ltag = Thread;
     49             T->lchild = pre;
     50         }
     51         if(!pre->rchild){
     52             pre->rtag = Thread;
     53             pre->rchild = T; 
     54         } 
     55         pre = T;
     56         InThreading(T->rchild);//递归右孩子线索化 
     57     }
     58 } 
     59 
     60 void InOrderThreading(BiThrTree &p,BiThrTree &T){
     61     p = (BiThrNode *)malloc(sizeof(BiThrNode));
     62     p->ltag = Link;
     63     p->rtag = Thread;
     64     p->rchild = p;
     65     if(!T)
     66         p->lchild = p;
     67     else{
     68         p->lchild = T;
     69         pre = p;
     70         InThreading(T);
     71         pre->rchild = p;
     72         pre->rtag = Thread;
     73         p->rchild = pre;
     74     }
     75 }
     76 
     77 void visit(char c){
     78     printf("%c",c);
     79 }
     80 
     81 //中序遍历,非递归
     82 void InOrderTraverse(BiThrTree T){
     83     BiThrTree p;
     84     p = T->lchild;
     85     while(p!=T){
     86         while(p->ltag==Link)
     87             p = p->lchild;
     88         visit(p->data);
     89         while(p->rtag==Thread&&p->rchild!=T){
     90             p = p->rchild;
     91             visit(p->data);
     92         }
     93         p = p->rchild;
     94     }
     95 } 
     96 
     97 int main(){
     98     BiThrTree p,T = NULL;
     99     CreateBiThrTree(T);
    100     InOrderThreading(p,T);
    101     printf("中序遍历输出结果为:");
    102     InOrderTraverse(p); 
    103     printf("
    ");
    104     return 0;
    105 }

  • 相关阅读:
    OpenGL编程 基础篇(二)Sierpinski垫片
    PAT1045. Favorite Color Stripe
    OpenGL编程 基础篇(一)
    百练1145:Tree Summing
    百练1745:Divisibility
    百练1321:棋盘问题
    Scrapy架构及其组件之间的交互
    MongoDB快速入门
    Redis快速入门
    Memcache所有方法及参数详解
  • 原文地址:https://www.cnblogs.com/geziyu/p/10106032.html
Copyright © 2020-2023  润新知