前驱或者后继指的是深度优先遍历序列中的顺序
在一般的遍历中(深度优先遍历和层次遍历)需要用栈或队列保存父节点的信息
而二叉树的线索化(给出一条直接指向其前驱或者后继的路径)是
将空指针指向其所在节点在遍历序列中前驱(左空指针)或者后继(右空指针)
中序线索化(最常见)
底部的是空分支(指针=NULL)
遍历序列的头尾没有前驱或者后继,所以还存在两个空指针
线索二叉树的存储结构:
typedef struct BTNode{int data; BTNode* LChild; BTNode* RChild;}BTNode;//二叉树的存储结构
typedef struct BTNode{int data; BTNode* LChild; BTNode* RChild;int Ltag;int Rtag;}BTNode;//线索二叉树的存储结构
当tag=1时叶子节点的线索指针起作用
二叉树的(先序)遍历&树的(先序)遍历&图的(深度优先)遍历
void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
if(p!=NULL)
{
f(p->LChild,pre);
if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
pre=p;
f(p->RChild,pre);
}
}
先序:
void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
if(p!=NULL)
{
if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
pre=p;
if(p->Ltag==0)//注意细节
f(p->LChild,pre);
if(p->Rtag==0)
f(p->RChild,pre);
}
}
后序:
void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
if(p!=NULL)
{
f(p->LChild,pre);
f(p->RChild,pre);
if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
pre=p;
}
}