线索二叉树
线索二叉树 WHY 方便从任一个结点出发,找到其前驱、后继;方便遍历 普通二叉树中,对任意一个结点,若想找到其前驱/后继结点,只能再进行一次相应的前/中/后序遍历才行,复杂度太高。 为此,我们引入前驱线索,后继线索的概念。其中,前驱线索由左孩子指针充当,后继线索由右孩子指针充当。 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; 构建出如下图所示的结构: 但是, *lchild(*rchild)有可能指向存在的结点,为此我们引入线索标志。当线索标志为1时,表示孩子指针指向前驱后继,线索标志为0时,表示孩子指针指向左右孩子。此时 typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//左右线索标志 }ThreadNode,*ThreadTree; 这样,每一个线索链表中的结点就可以图示为: HOW 如何分别用代码实现前中后序遍历下的线索链表 1.中序线索化 其实中序线索化的过程就是再进行一遍中序遍历,为每个节点添加额外的信息(lchild, rcild, ltag, rtag). 🍔初始定义结构体 typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag; }ThreadNode,*ThreadTree; 🍔定义前驱指针 ThreadNode *pre=NULL; 前驱指针还可以定义在局部,这里为了方便起见,将pre定义为全局。 🍔开始定义处理函数 void CreatInThread(ThreadTree T){ pre=NULL; if(T!=NULL){ InThread(T); if(pre->rchild==NULL){ pre->rtag=1; } } } 注意:最后一个节点单独处理...