用C++实现线索二叉树的三种遍历方法,需要代码
时间: 2024-03-07 07:50:25 浏览: 60
线索二叉树是一种特殊的二叉树,它利用二叉树中的空指针域,将其转化为用于指向前驱和后继的线索。线索二叉树的遍历方法有三种:中序线索二叉树遍历、前序线索二叉树遍历和后序线索二叉树遍历。下面是使用C++实现这三种遍历方法的代码:
```cpp
#include<iostream>
using namespace std;
// 线索二叉树结构体
struct ThreadNode {
char data;
ThreadNode* lchild, * rchild;
int ltag, rtag; // 线索标志,0表示指向孩子,1表示指向前驱或后继
};
// 中序遍历线索二叉树
void InOrder(ThreadNode* T) {
if (T == NULL) return;
ThreadNode* p = T;
while (p->ltag == 0) p = p->lchild; // 找到中序遍历的起点
while (p != NULL) {
cout << p->data << " ";
if (p->rtag == 1) p = p->rchild; // 如果有后继,则直接跳到后继
else {
p = p->rchild;
while (p != NULL && p->ltag == 0) // 找到下一个中序遍历的结点
p = p->lchild;
}
}
}
// 前序遍历线索二叉树
void PreOrder(ThreadNode* T) {
if (T == NULL) return;
ThreadNode* p = T;
while (p != NULL) {
cout << p->data << " ";
if (p->ltag == 0) p = p->lchild; // 如果有左孩子,则遍历左孩子
else if (p->rtag == 0) p = p->rchild; // 如果没有左孩子但有右孩子,则遍历右孩子
else { // 如果没有左孩子也没有右孩子,则回溯到第一个有右孩子的祖先
while (p != NULL && p->rtag == 1) p = p->rchild;
if (p != NULL) p = p->rchild;
}
}
}
// 后序遍历线索二叉树
void PostOrder(ThreadNode* T) {
if (T == NULL) return;
ThreadNode* p = T;
while (p->ltag == 0) p = p->lchild; // 找到后序遍历的起点
while (p != NULL) {
if (p->rtag == 0 && p->rchild != NULL) { // 如果右孩子存在且未被访问,则遍历右孩子
p = p->rchild;
while (p->ltag == 0) p = p->lchild; // 找到右孩子的后继
}
else { // 否则访问该结点,并回溯到第一个有右孩子的祖先
cout << p->data << " ";
while (p->rtag == 1) {
p = p->rchild;
if (p == NULL) return; // 遍历结束
}
p = p->rchild;
while (p != NULL && p->ltag == 0) p = p->lchild; // 如果右孩子的左子树存在,则遍历左子树
}
}
}
int main() {
// 创建一棵线索二叉树
ThreadNode node1 = { 'A', NULL, NULL, 0, 0 };
ThreadNode node2 = { 'B', NULL, NULL, 0, 0 };
ThreadNode node3 = { 'C', NULL, NULL, 0, 0 };
ThreadNode node4 = { 'D', NULL, NULL, 0, 0 };
ThreadNode node5 = { 'E', NULL, NULL, 0, 0 };
ThreadNode node6 = { 'F', NULL, NULL, 0, 0 };
ThreadNode node7 = { 'G', NULL, NULL, 0, 0 };
ThreadNode node8 = { 'H', NULL, NULL, 0, 0 };
node1.lchild = &node2;
node1.rchild = &node3;
node2.lchild = &node4;
node2.rchild = &node5;
node3.lchild = &node6;
node3.rchild = &node7;
node5.rchild = &node8;
node4.rtag = 1;
node4.rchild = &node2;
node5.ltag = 1;
node5.lchild = &node1;
node5.rtag = 1;
node5.rchild = &node3;
node8.ltag = 1;
node8.lchild = &node5;
ThreadNode* T = &node1;
// 中序遍历线索二叉树
cout << "InOrder: ";
InOrder(T);
cout << endl;
// 前序遍历线索二叉树
cout << "PreOrder: ";
PreOrder(T);
cout << endl;
// 后序遍历线索二叉树
cout << "PostOrder: ";
PostOrder(T);
cout << endl;
return 0;
}
```
阅读全文