这个弄了好久,最主要理解中序遍历各节点的lchild指向左孩子还是前驱
和rchild指向右孩子还是后继,
还有线索化前的初始化和线索好之后的初始化(不知道这么说对不对,毕竟初学),
可以看看小甲鱼的视频,讲解的很不错,
上代码,前序输入就行,看代码自行了解输入规则,
#include<cstdio> #include<cstring> #include<cstdlib> typedef enum { Link,Thread }PointerTag; typedef struct BiThrNode{ char data; struct BiThrNode *lchild,*rchild; PointerTag LTag; PointerTag RTag; }BiThrNode,*BiThrTree; BiThrTree pre; void CreateThrTree(BiThrTree *T){ char c; scanf("%c",&c); if(‘ ‘ == c){ (*T) = NULL; }else{ *T = (BiThrTree)malloc(sizeof(BiThrNode)); (*T)->data = c; (*T)->LTag = Link; (*T)->RTag = Link; CreateThrTree(&(*T)->lchild); CreateThrTree(&(*T)->rchild); } } void InThreading(BiThrTree T){ if(T){ InThreading(T->lchild); if(T->lchild == NULL){ T->LTag = Thread; T->lchild = pre; } if(pre->rchild == NULL){ pre->RTag = Thread; pre->rchild = T; } pre = T; InThreading(T->rchild); } } void InOrderThreading(BiThrTree *p,BiThrTree T){ *p = (BiThrTree)malloc(sizeof(BiThrNode)); (*p)->LTag = Link; (*p)->RTag = Thread; (*p)->rchild = *p; if(!T){ (*p)->lchild = *p; }else{ (*p)->lchild = T; pre = *p; InThreading(T); pre->rchild = *p; pre->RTag = Thread; (*p)->rchild = pre; } } void OnOrderTraverse(BiThrTree T){ BiThrTree p; p = T->lchild; while(p != T){ while(p->LTag == Link){ p = p->lchild; } printf("%c\n",p->data); while(p->RTag == Thread && p->rchild != T){ p = p->rchild; printf("%c\n",p->data); } p = p->rchild; } } int main(){ BiThrTree p,T; CreateThrTree(&T); InOrderThreading(&p,T); OnOrderTraverse(p); // InThreading(T); return 0; }
时间: 2024-11-14 13:14:43