用C语言写出中序线索二叉树的遍历代码
时间: 2023-06-08 19:07:57 浏览: 110
C语言实现二叉树的中序遍历(递归)
好的,以下是中序线索二叉树的遍历代码:
```c
// 中序线索二叉树节点结构体
typedef struct ThreadNode{
int data; // 数据
struct ThreadNode *lchild; // 左孩子指针
struct ThreadNode *rchild; // 右孩子指针
int ltag; // 左标志位
int rtag; // 右标志位
}ThreadNode, *ThreadTree;
// 中序线索化二叉树
void InThread(ThreadTree T, ThreadNode *&pre){
if (T != NULL){
InThread(T->lchild, pre); // 遍历左子树
if (T->lchild == NULL){ // 左孩子为空,建立前驱线索
T->lchild = pre;
T->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL){ // 前一个节点的右孩子为空,建立后继线索
pre->rchild = T;
pre->rtag = 1;
}
pre = T; // 记录前一个访问节点
InThread(T->rchild, pre); // 遍历右子树
}
}
// 创建中序线索二叉树
void CreateInThread(ThreadTree &T){
ThreadNode *pre = NULL;
if (T != NULL){
InThread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
// 中序线索二叉树遍历
void Inorder(ThreadTree T){
ThreadNode *p = T->lchild; // 先找到最左子节点
while (p != T){
while (p->ltag == 0){ // 如果左节点是二叉树节点,一直往左走
p = p->lchild;
}
cout << p->data << " "; // 输出节点值
while (p->rtag == 1 && p->rchild != T){ // 如果右节点是线索,输出后继节点
p = p->rchild;
cout << p->data << " ";
}
p = p->rchild; // 如果右节点是二叉树节点,一直往右走
}
}
```
希望能对你有所帮助!
阅读全文