#include<stdio.h> #include<stdlib.h> typedef enum { link, thread } PointerTag; //创建树的一个节点 typedef struct BiNode { char data; struct BiNode *lchild; struct BiNode *rchild; PointerTag ltag; PointerTag rtag; }BitrNode, *BiTree; //创建一个全局变量,始终指向刚刚访问的结点 BiTree pre; //这里可以看出 这是一个指针 //创建一棵树 运用前序遍历创建 要注意区分一级指针和二级指针 CreateThree(BiTree *T) { char c; scanf("%c", &c); if (' ' == c) { (*T) = NULL; } else { *T = (BitrNode *)malloc(sizeof(BitrNode)); (*T)->data = c; (*T)->ltag = link; //这里先假设是成立的 (*T)->rtag = link; CreateThree(&(*T)->lchild); // 这里函数的接口是个二层指针。因此这里应该是一个地址 CreateThree(&(*T)->rchild); } } //进行中序遍历,线索化(修改ltag和指向对象) Inthreading(BiTree T) { if (T != NULL) { Inthreading((T)->lchild); //递归,一直递归到最左的叶子 if ((T)->lchild == NULL) { (T)->ltag = thread; (T)->lchild = pre; } if (pre->rchild == NULL) { pre->ltag = thread; pre->rchild = T; } pre = T; //这一句有待考证 Inthreading((T)->rchild); //递归,一直递归到最右的叶子 } } InOrderThreading(BiTree p, BiTree T) { p = (BiTree)malloc(sizeof(BitrNode)); 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; } } int main() { BiTree T; CreateThree(&T); InOrderThreading(pre, T); }