连写3篇博客。。。记录这2天的学习内容。。。
代码。。。。
// 参考 大话数据结构
#include <iostream>
#define NULLCHAR '#'
using namespace std;
enum Type{ LINK, THREAD };
typedef struct BiTrtree
{
char data;
struct BiTrtree *left, *right;
Type lType, rType;
}bitrtree, *bitrtreePtr;
//中序线索化
bitrtreePtr preNode = NULL; //必须有这个
void inThreading(bitrtreePtr tree)
{
/*
这种方法会导致右子树最后一个节点的rType没被标成THREAD
*/
if (tree)
{
inThreading(tree->left); //递归左子树
if (tree->left == NULL)
{
tree->lType = Type::THREAD;
tree->left = preNode;
}
if (preNode && preNode->right == NULL) //这里要判断preNode是否存在
{
preNode->rType = Type::THREAD;
preNode->right = tree;
}
preNode = tree;
inThreading(tree->right); //递归右子树
}
}
//二叉树的建立
void createTree(bitrtreePtr *tree)
{
char c;
cin >> c;
if (c == NULLCHAR)
*tree = NULL;
else
{
*tree = (bitrtreePtr)malloc(sizeof(bitrtree));
(*tree)->data = c;
(*tree)->lType = Type::LINK;
(*tree)->rType = Type::LINK;
createTree(&(*tree)->left);
createTree(&(*tree)->right);
}
}
//线索二叉树的遍历
void traversal(bitrtreePtr tree) //从左往右
{
while (tree) //为空的时候结束循环
{
while (tree->left && tree->lType == Type::LINK) //左子树存在且类型为LINK,则循环到要输出的第一个节点
tree = tree->left;
cout << tree->data;
while (tree->right && tree->rType == Type::THREAD)//右子树存在且类型为THREAD,则循环输出它们的data
{
tree = tree->right;
cout << tree->data;
}
tree = tree->right; //进入右子树
}
cout << endl;
}
void traversal2(bitrtreePtr tree) //从右往左
{
while (tree)
{
while (tree->right && tree->rType == Type::LINK)
{
tree = tree->right;
}
cout << tree->data;
while (tree->left && tree->lType == Type::THREAD)
{
tree = tree->left;
cout << tree->data;
}
tree = tree->left;
}
cout << endl;
}
//ABCDF###E###GH##I#J##
int main()
{
bitrtreePtr tree = NULL;
//生成二叉树
createTree(&tree);
//中序线索化
inThreading(tree);
cout << "Left to right:";
traversal(tree);
cout << "Right to left:";
traversal2(tree);
return 0;
}
主要就是空的左儿子指向前驱,空的右儿子指向后继,(画的有点难看=。=)
结果。。。。。