线索二叉树
来源:互联网 发布:linux中man命令 编辑:程序博客网 时间:2024/06/05 16:33
用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。但是常常我们会想要更加直观的知道节点的前驱后继。线索二叉树显得尤为的重要。
线索二叉树的关键就是要定义一个全局变量来存放上一个访问过的结点。
Node* prev;
(一)前序线索二叉树
void PrevOrderTag(){_PrevOrderTag(_root);}void _PrevOrderTag(Node* root)//前序线索二叉树{if (root == NULL)return;if (!root->_left){root->_leftTag = THREAD;root->_left = prev;}if (prev && !prev->_right){prev->_rightTag = THREAD;prev->_right = root;}prev = root;if (root->_leftTag == LINK)//只有当_leftTag为LINK时递归修改前驱后继_PrevOrderTag(root->_left);if (root->_rightTag == LINK)_PrevOrderTag(root->_right);}void PrevOrderTagPrint()//前序线索化打印{Node* cur = _root;//while (cur)//{//while (cur->_leftTag == LINK)//{//cout << cur->_data << " ";//cur = cur->_left;//}//cout << cur->_data << " ";//cur = cur->_right;//}//2.while (cur){cout << cur->_data << " ";if (cur->_leftTag == LINK){cur = cur->_left;}else{cur = cur->_right;}}}
使用二叉树的线索打印二叉树是比较方便的,不用递归就能解决问题。只要cur不为NULL就一直寻找后继打印。
(二)中序线索二叉树
void MidOrderTag(){_MidOrderTag(_root);}void _MidOrderTag(Node* root)//中序线索二叉树{if (root == NULL){return;}if (root->_leftTag == LINK)//只有当_leftTag为LINK时递归修改前驱后继 _MidOrderTag(root->_left); if (!root->_left){root->_leftTag = THREAD;root->_left = prev;}if (prev&&!prev->_right){prev->_rightTag = THREAD;prev->_right = root;}prev = root;if (root->_rightTag == LINK) _MidOrderTag(root->_right);}void MidOrderTagPrint()//中序线索打印{Node* cur = _root;while (cur){while (cur->_leftTag == LINK){cur = cur->_left;}cout << cur->_data << " ";while (cur->_rightTag == THREAD){cur = cur->_right;cout << cur->_data << " ";}cur = cur->_right;//在打印右子树之前一定保证左子树已经打印过了}cout << endl;}
前序的线索化打印不难懂,但是中序得知道什么时候访问右结点,在访问了左节点后才能访问右节点。
(三)后序线索二叉树
void RearOrderTag(){_RearOrderTag(_root);}void _RearOrderTag(Node* root)//后序线索二叉树{if (root == NULL){return;}if (root->_leftTag == LINK)//只有当_leftTag为LINK时递归修改前驱后继 _RearOrderTag(root->_left);if (root->_rightTag == LINK) _RearOrderTag(root->_right); if (!root->_left){root->_leftTag = THREAD;root->_left = prev;}if (prev&&!prev->_right){prev->_rightTag = THREAD;prev->_right = root;}prev = root;}
注意,线索二叉树只有当tag的类型为LINK时才修改结点的前驱和后继
0 0
- 线索二叉树 --->树
- 线索二叉树算法
- C#线索二叉树
- 线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树
- 线索化二叉树
- 线索二叉树
- C#线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树实例
- 线索二叉树
- 线索二叉树算法
- C++线索二叉树
- 线索二叉树
- 线索二叉树实现
- 二叉树的递归实现
- 第十三周实践项目1————分数类的运算符重载(2)
- Google推荐的图片加载库Glide介绍
- 二叉树的非递归实现
- Gradle生命周期
- 线索二叉树
- 大数运算之字符串模拟
- 操作系统之银行家算法
- 数据结构之堆(Heap)的实现
- 找出N个数据中的最大的K个数据---堆排序
- 优先级队列
- 斐波那契数列的最优算法(O(logN))
- TableView 实现京东购物车功能
- 在网页上显示当前日期