美文网首页
线索二叉树

线索二叉树

作者: Pwnmelife | 来源:发表于2019-01-12 15:55 被阅读0次
#include <stdio.h>
#include <stdlib.h>

// 线索存储标志位
// Link(0): 表示指向左右孩子的指针
// Thread(1): 表示指向前驱后继的线索
typedef char ElemType ;
typedef enum { Link, Thread } PointerTag;
typedef struct ThreadNode {
    ElemType data;
    struct ThreadNode *lchild, *rchild;
    PointerTag ltag, rtag;
}ThreadNode, *ThreadTree;


ThreadTree pre = NULL; 

void CreateInThread(ThreadTree *p);
void Inthread(ThreadTree T);
void InOrderThread(ThreadTree *, ThreadTree p);
void InorderTraverse(ThreadTree T);


int main(){
    
    ThreadTree P,T = NULL;
    CreateInThread(&T);
    InOrderThread(&P, T);
    InorderTraverse(P);
    return 0;
}

//前序建立二叉树, 约定用户遵照前序遍历的方式输入

void CreateInThread(ThreadTree* p){
    char c;
    scanf("%c", &c);
    if (' ' == c) {
        *p = NULL;
    }
    else {
        (*p) = (ThreadTree)malloc(sizeof(ThreadNode));
        (*p)->data = c;
        (*p)->ltag = Link;
        (*p)->rtag = Link;
        CreateInThread(&(*p)->lchild);
        CreateInThread(&(*p)->rchild);
    }
}
// 中序遍历线索化
void Inthread(ThreadTree T) {
    if (T) {
        Inthread(T->lchild);        //递归做孩子线索化
        if (T->lchild == NULL) {    //修改本节点的前驱
            T->ltag = Thread;
            T->lchild = pre;
        }
        if (pre->rchild == NULL) { //修改前一个节点的后继
            pre->rtag = Thread;
            pre->rchild = T;
        }
        pre = T;
        Inthread(T->rchild);        //递归做孩子线索化
    }
    else {
        return;
    }
}
void InOrderThread(ThreadTree* p, ThreadTree T) {
    (*p) = (ThreadTree)malloc(sizeof(ThreadNode)); //*P is head node
    (*p)->ltag = Link;
    (*p)->rtag = Thread;
    (*p)->rchild = (*p);
    if (!T) {
        (*p)->lchild = (*p);
    }
    else {
        (*p)->lchild = T;
        pre = *p;
        Inthread(T); // Inthread函数执行后,pre指向最后一个节点
        pre->rchild = *p;
        pre->rtag = Thread;
        (*p)->rchild = pre;
    }
}
// 中序遍历二叉树, 非递归
//void InorderTraverse(ThreadTree T) {
//  ThreadTree p;
//  p = T->lchild;
//  while (p != T) {
//      while (p->ltag == Link) {
//          p = p->lchild;
//      }
//      printf("%c", p->data);
//      while (p->rtag == Thread && p->rchild != T) {
//          p = p->rchild;
//          printf("%c", p->data);
//      }
//      p = p->rchild;
//  }
//}
//和二叉树的中序遍历没有区别,只不过加了一个判断是不是Link
void InorderTraverse(ThreadTree T) {
    if (T) {
        if (T->ltag == Link) {
            InorderTraverse(T->lchild);
        }
        printf("%c", T->data);
        if (T->rtag == Link) {
            InorderTraverse(T->rchild);
        }
    }
}

相关文章

  • 线索二叉树操作

    树节点 创建中序线索二叉树 遍历中序线索二叉树 创建前序线索二叉树 遍历前序线索二叉树 参考:https://bl...

  • 二叉树—线索二叉树

    1、线索二叉树的引入 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或...

  • javascript线索化二叉树

    定义二叉树创建方法 对二叉树进行中序线索化 遍历线索二叉树 测试

  • 数据结构线索二叉树

    线索二叉树构成 线索化的节点 实现

  • 数据结构与算法分析四 树(续)

    ** 顺序存储 ** 线索化二叉树 线索化代码实现

  • 理解线索二叉树

    原链接:理解线索二叉树|CloudWong 线索二叉树原理 遍历二叉树的其实就是以一定规则将二叉树中的结点排列成一...

  • 数据结构题目56:线索二叉树的更新

    题目:线索二叉树的更新所谓线索二叉树的更新是指在线索二叉树中插入一个结点或者删除一个结点。一般情况下,这些操作有可...

  • 数据结构与算法13-线索二叉树

    定义 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历...

  • 线索化二叉树的实现

    概念   在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行...

  • 数据结构与算法[线索化二叉树]

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其...

网友评论

      本文标题:线索二叉树

      本文链接:https://www.haomeiwen.com/subject/circdqtx.html