前序线索二叉树

来源:互联网 发布:淘宝女包店铺 编辑:程序博客网 时间:2024/04/28 00:52
#include <iostream>#include <stack>using namespace std;typedef enum {Link,Thread,}Tag;typedef struct Node {int value;Tag lTag;Tag rTag;struct Node *left;struct Node *right;}Node, *ptrNode;class ThreadedBinaryTree {private:ptrNode tree;ptrNode head;public:void init();bool search(int value, ptrNode *&ptr);void add(int value);void preTraverse();void preThreading();void preOrderTraverse_Thr();};void ThreadedBinaryTree::preOrderTraverse_Thr() {ptrNode p = tree;while(p != head) {std::cout << p->value << " ";if (p->lTag == Link) {p = p->left;} else {p = p->right;}}}void ThreadedBinaryTree::preThreading() {head = new Node();if(tree) {head->lTag = Link;head->left = tree;} else {head->lTag = Thread;head->left = head;}ptrNode p = head;ptrNode q = head->left;stack<ptrNode> s;while(q || !s.empty()) {if (q) {s.push(q);if (q->left) {q->lTag = Link;p = q;q = q->left;} else {q->lTag = Thread;q->left = p;p = q;q = NULL;}} else {q = s.top()->right;s.pop();if (p->right) {p->rTag = Link;} else {p->rTag = Thread;p->right = q;}}}p->rTag = Thread;p->right = head;head->rTag = Thread;head->right = p;}void ThreadedBinaryTree::preTraverse() {ptrNode p = tree;stack<ptrNode> s;while (p || !s.empty()) {if (p) {std::cout << p->value << " ";s.push(p);p = p->left;} else {p = s.top()->right;s.pop();}}std::cout << std::endl;}void ThreadedBinaryTree::add(int value) {ptrNode *ptr;if(!search(value, ptr)) {ptrNode p = new Node();p->value = value;p->left = NULL;p->right = NULL;*ptr = p;}}bool ThreadedBinaryTree::search(int value, ptrNode *&ptr) {ptr = &tree;while (*ptr) {if (value < (*ptr)->value) {ptr = &(*ptr)->left;} else if (value > (*ptr)->value) {ptr = &(*ptr)->right;} else {return true;}}return false;}void ThreadedBinaryTree::init() {tree = NULL;}int main() {ThreadedBinaryTree *tbt = new ThreadedBinaryTree();tbt->init();tbt->add(62);tbt->add(88);tbt->add(58);tbt->add(47);tbt->add(35);tbt->add(73);tbt->add(51);tbt->add(99);tbt->add(37);tbt->add(93);tbt->preTraverse();tbt->preThreading();tbt->preOrderTraverse_Thr();delete tbt;return 0;}
前序遍历二叉树:       62 58 47 35 37 51 88 73 99 93
遍历前序线索二叉树:62 58 47 35 37 51 88 73 99 93
0 0