线索二叉树的建立及遍历

来源:互联网 发布:古剑奇谭ol激活码淘宝 编辑:程序博客网 时间:2024/04/30 19:27

连写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;}


测试数据"ABCDF###E###GH##I#J##"生成的线索二叉树

主要就是空的左儿子指向前驱,空的右儿子指向后继,(画的有点难看=。=)



结果。。。。。



0 0
原创粉丝点击