数据结构之二叉树(前序 中序 后续线索话非递归方式)
2016-06-03 10:18
579 查看
节点: enum LinkType { THREAD, LINK }; template<class T> struct ThredBinaryNode { ThredBinaryNode *_left; ThredBinaryNode *_right; LinkType _left_tag; LinkType _right_tag; T _data; ThredBinaryNode( T data ) :_data(data), _left( NULL), _right(NULL ), _left_tag(LINK), _right_tag(LINK) {}; }; 线索化二叉树为: template<class T> class BinaryTreeThred { typedef ThredBinaryNode <T> Node; public: BinaryTreeThred( const T * a, size_t size, const T & valiue) { size_t index = 0; _root = _CreatTree( a, size , index, valiue); } private: Node *_root; }; 构造函数: Node*_CreatTree(const T* a, size_t size, size_t &index, const T &valiue) { Node *root = NULL ; if (index < size&& a[index ] != valiue) { root = new Node (a[index]); root->_left = _CreatTree(a, size , ++index, valiue); root->_right = _CreatTree(a, size , ++index, valiue); } return root; } 中序线索化递归: void _InThred(Node *cur, Node* & prev)//递归线索化 { if (cur != NULL) { _InThred( cur->_left, prev ); if (cur ->_left == NULL) { cur->_left_tag = THREAD ; cur->_left = prev ; } if (prev != NULL&& prev->_right==NULL ) { prev->_right_tag = THREAD ; prev->_right = cur ; } prev = cur ; _InThred( cur->_right, prev ); } }; 中序线索非递归: void InThred_Nor()//非递归 { stack<Node *> s; Node *prev = NULL ; Node *cur = _root; while (cur||!s.empty()) { while (cur) { s.push(cur); cur = cur->_left; }; Node *tmp = s.top(); s.pop(); if (tmp->_left == NULL ) { tmp->_left = prev; tmp->_left_tag = THREAD; } prev = tmp; if (prev->_right == NULL &&!s.empty()) { tmp->_right = s.top(); tmp->_right_tag = THREAD; } else { cur = tmp->_right; } } } 前序线化非递归: void BinaryTreeThred <T>::PreThread() //前序线索化非递归 { Node *pre = NULL ; Node*cur = _root; stack<Node *> s; s.push(cur); while (cur||!s.empty()) { Node *tmp = NULL ; if (!s.empty()) { tmp = s.top(); } else { return; } s.pop(); if (tmp->_right) { s.push(tmp->_right); } if (tmp->_left) { s.push(tmp->_left); } else//tmp->left==null { tmp->_left_tag = THREAD; tmp->_left=pre; } if (pre != NULL &&pre->_right == NULL) { pre->_right_tag = THREAD; pre->_right = tmp; } pre = tmp; } } 后序列线索话非递归: void BinaryTreeThred <T>::PostThread() //后续 { Node *cur = _root; stack<Node *> s; Node *prev = NULL ; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left;//3 } Node *tmp = s.top(); if (tmp->_right == NULL || tmp->_right == prev) { if (tmp->_left == NULL ) { tmp->_left_tag = THREAD; tmp->_left = prev; } if (prev != NULL &&prev->_right == NULL) { prev->_right_tag = THREAD; prev->_right = tmp; } s.pop(); prev = tmp; } else { cur = tmp->_right; } } }
相关文章推荐
- 数据结构上机测试2-2:单链表操作B
- 大话数据结构读书笔记系列(六)树<下篇>
- 【BZOJ3289】 Mato的文件管理
- 数据结构之二叉搜索树(BinarySearchTree)
- 数据结构---浮点数的存储&无符号数
- 数据结构笔记整理第7章:排序
- 数据结构概览
- 数据结构上机测试1:顺序表的应用
- [数据结构]tree-form data structure summary
- Leftist Heaps 习题解
- php学习笔记数组与数据结构1(日期时间函数及遇到的问题解决)
- 数据结构-简单的链表结构
- java数据结构之(顺序栈+链式栈)
- poj--2559 Largest Rectangle in a Histogram(单调栈)
- 数据结构与算法分析(6)表的应用实例
- 数据结构—图的邻接矩阵存储
- 查找算法 - 二分法查找
- 高并发数据结构Disruptor解析(1)
- 使用scala实现pageRank算法
- 排序算法——归并排序(递归)