数据结构-二叉树的线索化
2017-03-05 15:33
375 查看
主要代码实现:
#pragma once #include <iostream> using namespace std; enum Type { LINK, //指针指向的是一颗子树 THREAD //指针指向的是线索化 }; template<typename T> struct BinaryTreeThdNode { T _data; BinaryTreeThdNode* _left; BinaryTreeThdNode* _right; Type _left_type; Type _right_type; BinaryTreeThdNode(const T& data) :_data(data) , _left(NULL) , _right(NULL) , _left_type(LINK) , _right_type(LINK) {} }; template <typename T> class BinaryTreeThd { typedef BinaryTreeThdNode<T> Node; public: BinaryTreeThd(T* a, size_t size, const T& invalid=T()) { size_t index = 0; _root = _CreatTree(a, size, index, invalid); } void PrevOrderThreading() //先序线索化 { Node* prev = NULL; _PrevOrderThreading(_root, prev); } void InOrderThreading() //中序线索化 { Node* prev = NULL; _InOrderThreading(_root, prev); if (prev && prev->_right == NULL) prev->_right_type = THREAD; } void PrevOrderThd() //先序线索化遍历 { Node* cur = _root; while (cur) { while (cur->_left_type == LINK) { cout << cur->_data << " "; cur = cur->_left; } cout << cur->_data << " "; cur = cur->_right; } cout << endl; } void InOrderThd() //中序线索化遍历 { Node* cur = _root; while (cur) { //寻找最左节点并访问 while (cur->_left_type == LINK) { cur = cur->_left; } cout << cur->_data << " "; while (cur && cur->_right_type == THREAD) { cur = cur->_right; if (cur) cout << cur->_data << " "; } if (cur) cur = cur->_right; } cout << endl; } protected: Node* _CreatTree(T* a, size_t size, size_t& index, const T& invalid = T()) { if (a[index] == invalid || index >= size) return NULL; Node* root = new Node(a[index]); root->_left = _CreatTree(a, size, ++index, invalid); root->_right = _CreatTree(a, size, ++index, invalid); return root; } void _InOrderThreading(Node* root, Node*& prev) { Node* cur = root; if (cur == NULL) return; _InOrderThreading(cur->_left, prev); if (cur->_left == NULL) { cur->_left = prev; cur->_left_type = THREAD; } if (prev && prev->_right == NULL) { prev->_right = cur; prev->_right_type = THREAD; } prev = cur; _InOrderThreading(cur->_right, prev); } void _PrevOrderThreading(Node* root, Node*& prev) { Node* cur = root; if (cur == NULL) return; if (cur->_left == NULL) { cur->_left = prev; cur->_left_type = THREAD; } if (prev && prev->_right == NULL) { prev->_right = cur; prev->_right_type = THREAD; } prev = cur; if (cur->_left_type != THREAD) _PrevOrderThreading(cur->_left, pre 4000 v); if (cur->_right_type != THREAD) _PrevOrderThreading(cur->_right, prev); } protected: Node* _root; };
相关文章推荐
- 【数据结构】线索化二叉树中序线索化的递归写法和非递归写法
- (c语言)二叉树中序线索(数据结构十七)
- 【算法与数据结构】二叉树 中序线索
- 数据结构--二叉树的线索化
- 【数据结构】线索化二叉树中序线索化的递归写法和非递归写法
- (c语言)二叉树中序线索(数据结构十七)
- 【数据结构】线索化二叉树的基本操作
- 数据结构 — 二叉树的线索化
- 数据结构--二叉树的线索化
- 第十一周--数据结构--线索化二叉树(中序)
- 数据结构——中序线索化二叉树
- 数据结构-线索化二叉树
- 这是我参考网上编写的一道数据结构关于二叉树求其子树是否指针或者线索,及其对应得值,但是我运行结果却是有点问题,希望高手帮指教下!
- 2015年大二上-数据结构-树和二叉树-2-(4)中序线索化二叉树
- 【数据结构】中序线索化二叉树后实现一个迭代器来遍历二叉树
- 【算法与数据结构】二叉树 中序线索
- 【数据结构】线索化二叉树
- 数据结构——前序线索化二叉树
- 数据结构 二叉树的线索存储
- 数据结构 树的创建(线索化二叉树)