线索二叉树可以不通过栈就能实现二叉树的遍历
指向前驱和后继的指针称为线索,加上线索的二叉链表就称为线索链表,相应的二叉树就称为线索二叉树
对二叉树以某种次序遍历,使其成为线索二叉树的过程就叫做线索化
#include<iostream>
/*
线索二叉树可以不通过栈就能实现二叉树的遍历
*/
typedef char Elemtype;
typedef struct ThreadNode {
Elemtype data; //结点数据域
ThreadNode *lchild, *rchild; //左右子结点
int ltag, rtag; //标志位,为0代表有子节点,为1分别代表指向前驱结点和后继结点
}ThreadNode, *ThreadTree; //线索链表
/*
对二叉树以某种次序遍历其变为线索二叉树的过程就叫做线索化
*/
//中序遍历对二叉树线索化的递归算法
void InThread(ThreadTree &p, ThreadTree &pre) {
//pre指向中序遍历时上一个刚刚访问过的结点,初值为NULL
if (p) {
InThread(p->lchild, pre);
//如果该结点的左孩子为空,那么把左孩子指向前驱结点,并把标志位置1
if (p->lchild == NULL) {
p->lchild = pre;
p->ltag = 1;
}
//如果前驱结点存在,且右孩子不存在,把当前结点p赋给前驱结点的右孩子当作后继结点,并把标志位置1
if (pre&&pre->rchild == NULL) {
//中序遍历中前驱的右孩子如果为空,则访问完该前驱下一个肯定访问该结点
pre->rchild = p;
pre->rtag = 1;
}
pre = p; //更新结点
InThread(p->rchild, pre);
}
}
//中序遍历对二叉树线索化的非递归算法
void InOrderTraverse(ThreadTree T) {
ThreadTree p = T;
while (p) {
while (p->ltag == 0)
p = p->lchild;
printf("%c", p->data);
//如果p的右标志位为1,且后继结点存在,p指向后继结点
while (p->rtag == 1 && p->rchild) {
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild;
}
}
int main() {
}