連寫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;
}
主要就是空的左兒子指向前驅,空的右兒子指向後繼,(畫的有點難看=。=)
結果。。。。。