数据结构-二叉树线索化迭代器(续上节)
来源:互联网 发布:不可抗力网络剧在线看 编辑:程序博客网 时间:2024/06/03 13:21
#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,typename Ref, typename Ptr> //中序Iterator Ref和Ptr来实现const和非const迭代器的代码复用class BinaryTreeThdIterator{typedef BinaryTreeThdNode<T> Node;typedef BinaryTreeThdIterator<T, Ref, Ptr> Self;public:BinaryTreeThdIterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &(operator*());}Self operator++(){ _node = _Next(_node);return *this;}Self operator++(int){Self tmp(*this);_node = _Next(_node);return tmp;}Self operator--(){_node = _Prev(_node);return *this;}Self operator--(int){Self tmp(*this);_node = _Prev(_node);return tmp;}bool operator!=(const Self& s){return _node != s._node;}bool operator==(const Self& s){return _node == s._node;}protected:Node* _Next(Node* cur){if (cur->_right_type == LINK){cur = cur->_right;while (cur->_left_type == LINK){cur = cur->_left;}}else{cur = cur->_right;}return cur;}Node* _Prev(Node* cur){if (cur->_left_type == LINK){cur = cur->_left;while (cur->_right_type == LINK){cur = cur->_right;}}else{cur = cur->_left;}return cur;}protected:Node *_node;};template <typename T>class BinaryTreeThd //二叉树的线索化{typedef BinaryTreeThdNode<T> Node;public:typedef BinaryTreeThdIterator<T, T&, T*> Iterator;typedef BinaryTreeThdIterator<T, const T&, const T*> ConstIterator;public:BinaryTreeThd(T* a, size_t size, const T& invalid = T()){size_t index = 0;_root = _CreatTree(a, size, index, invalid);}void InOrderThreading() //中序线索化{Node* prev = NULL;_InOrderThreading(_root, prev);if (prev && prev->_right == NULL)prev->_right_type = THREAD;}Iterator Begin() {Node* cur = _root;while (cur->_left_type == LINK){cur = cur->_left;}return cur;}Iterator End(){return NULL;}ConstIterator Begin()const{Node* cur = _root;while (cur->_left_type == LINK){cur = cur->_left;}return cur;}ConstIterator End()const{return NULL;}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);}protected:Node* _root;};
0 0
- 数据结构-二叉树线索化迭代器(续上节)
- 数据结构-->线索二叉树
- 数据结构--线索二叉树
- 【数据结构】线索二叉树
- 数据结构-线索二叉树
- 数据结构 - 线索二叉树
- 线索二叉树-数据结构
- 【数据结构】线索二叉树
- 数据结构-线索二叉树
- 数据结构--线索二叉树
- 数据结构---线索二叉树
- 数据结构---线索二叉树
- 数据结构--线索二叉树
- [数据结构]线索二叉树
- 数据结构 树(线索二叉树)
- 数据结构--二叉树(线索链表)
- 数据结构(十六)线索二叉树
- 数据结构线索化二叉树
- C++文件操作小记
- 数据库设计三范式
- PAT乙级1069
- Java复制多级文件夹
- 问题 B: Divisible 【模运算】【HPU第一次积分赛】
- 数据结构-二叉树线索化迭代器(续上节)
- android中的样式与主题
- Longest Substring Without Repeating Characters
- android导入项目,出现Fix Gradle wrapper and re-import project问题以及相关问题的解决
- hdu5760 Palindrome Bo 经典dp
- Java源码集合类Hashtable学习
- 阿里-----数组四等分
- DNS_安装配置
- 浅谈WebLogic和Tomcat