看书一直没想明白、、、二叉树即使有线索了,对于左右子树都非空的二叉树,从后继怎么找到的前驱啊,找不到啊。啊。啊。(中序的)
搜了个代码看看,果然清晰透彻,浑身酥爽。【自从上次看懂KMP算法时,体验到浑身颤抖的感觉后,就打算将数据结构继续学下去。
中序线索化算法:
-
- typedef enum {Link,Thread} PointerTag;
- typedef struct node
- {
- DataType data;
- PointerTag ltag,rtag;
- struct node *lchild ,*rchild;
- }BinThrNode;
- typedef BinThrNode *BinThrTree;
- void InorderThreading(BinThrTree p)
- {
- if(p)
- {
- InorderThreading(p->lchild);
-
- t->ltag = (t->lchild)?Link:Thread;
- t->rtag = (t->rchild)?Link:Thread;
- if(pre)
- {
- if(pre->rtag==Thread)
- pre->rchild = p;
- if(p->ltag==Thread)
- p->lchid = pre;
- }
- pre = p;
- InorderThreading(t->rchild);
- }
- }
前驱和后继的查找
- BinThrNode *InorderSuccessor(BinThrNode *p)
- {
- BinThrNode *q;
- if(p->rtag==Thread)
- return p->rchlid;
- else
- {
- q = p->rchild;
- while(q->ltag==Link)
- q = q->lchild;
- return q;
- }
- }
- BinThrNode *Inorderpre(BinThrNode *p)
- {
- BinThrNode *q;
- if (p->ltag==Thread)
- return p->lchild;
- else{
- q=p->lchild;
- while (q->rtag==Link)
- q=q->rchild;
- return q;
- }
- }