中序遍历
土办法
typdef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
// 中序遍历
void InOrder(BiTree T) {
if(T != NULL){
InOrder(T->lchild); //递归遍历左子树
visit(T); //访问根结点
InOrder(T->rchild); //递归遍历右子树
}
}
// 访问节点q
void visit(BiTree *q){
if(q == p) //当前访问结点刚好是结点p
final = pre; //找到p的前驱
else
pre = q; //pre指向当前访问的结点
}
BiTNode *p; //p指向目标结点
BiTNode *pre = NULL; //指向当前访问结点的前驱
BiTNode *final = NULL;//用于记录最终结果
线索二叉树
// 线索二叉树结点
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag; // 左右线索标志
}ThreadNode, *ThreadTree;
// 全局变量pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;
// 中序线索化二叉树T
void CreateInThread(ThreadTree T){
pre = NULL;
if(T != NULL) { // 非空二叉树才能线索化
InThread(T);
if(pre->rchild == NULL)
pre->rtag = 1; //处理便利的最后一个结点
}
}
// 中序遍历二叉树
void InTread(ThreadNode T){
if(T != NULL){
InThread(T->lchild);
visit(T);
InTread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchild == NULL){
q->lchild = pre;
q->ltag = 1;
}
if(pre != NULL && pre->rchild == NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
先序遍历
// 线索二叉树结点
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag; // 左右线索标志
}ThreadNode, *ThreadTree;
// 全局变量pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;
// 中序线索化二叉树T
void CreateInThread(ThreadTree T){
pre = NULL;
if(T != NULL) { // 非空二叉树才能线索化
InThread(T);
if(pre->rchild == NULL)
pre->rtag = 1; //处理便利的最后一个结点
}
}
// 中序遍历二叉树
void PreTread(ThreadNode T){
if(T != NULL){
visit(T);
PreTread(T->lchild);
PreTread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchild == NULL){
q->lchild = pre;
q->ltag = 1;
}
if(pre != NULL && pre->rchild == NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
后序遍历
// 线索二叉树结点
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag; // 左右线索标志
}ThreadNode, *ThreadTree;
// 全局变量pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;
// 中序线索化二叉树T
void CreateInThread(ThreadTree T){
pre = NULL;
if(T != NULL) { // 非空二叉树才能线索化
InThread(T);
if(pre->rchild == NULL)
pre->rtag = 1; //处理便利的最后一个结点
}
}
// 中序遍历二叉树
void PostTread(ThreadNode T){
if(T != NULL){
PreTread(T->lchild);
PreTread(T->rchild);
visit(T);
}
}
void visit(ThreadNode *q){
if(q->lchild == NULL){
q->lchild = pre;
q->ltag = 1;
}
if(pre != NULL && pre->rchild == NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}