【C++】中序线索化二叉树及其遍历
2015-11-22 13:40
615 查看
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。
为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。
[align=left]enumPointerTag{THREAD,LINK};[/align]
template
<class
T>
struct
BinaryTreeNode_Thd
[align=left]{[/align]
T _data
; // 数据
BinaryTreeNode_Thd<T>*_left; //
左孩子
BinaryTreeNode_Thd<T>*_right; //
右孩子
PointerTag _leftTag; // 左孩子线索标志
PointerTag _rightTag; // 右孩子线索标志
[align=left]};[/align]
![](http://img.blog.csdn.net/20151122132832948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151122132917136)
为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。
[align=left]enumPointerTag{THREAD,LINK};[/align]
template
<class
T>
struct
BinaryTreeNode_Thd
[align=left]{[/align]
T _data
; // 数据
BinaryTreeNode_Thd<T>*_left; //
左孩子
BinaryTreeNode_Thd<T>*_right; //
右孩子
PointerTag _leftTag; // 左孩子线索标志
PointerTag _rightTag; // 右孩子线索标志
[align=left]};[/align]
<pre name="code" class="cpp"><pre name="code" class="cpp">#include<iostream> using namespace std; enum PointTag { LINK, THREAD, }; struct BinTreeThingNode { char _data; BinTreeThingNode*_left; BinTreeThingNode*_right; PointTag _leftTag; PointTag _rightTag; BinTreeThingNode(const char &data) :_data(data) , _left(NULL) , _right(NULL) , _leftTag(LINK) , _rightTag(LINK) {} }; class BinTreeThreading { public: BinTreeThreading(const char *str) { _CreatBinTreeThreading(_root,str);//递归创建二叉树 } void InOderThread()//中序线索化 { BinTreeThingNode*prev = NULL;//prev是访问的上一节点 _InOderThread(_root, prev);//中序线索化的实现 } void InOderSort()//通过中序线索化中序遍历二叉树 { BinTreeThingNode*cur = _root; while (cur) { while (cur&&cur->_leftTag != THREAD) { cur = cur->_left; } cout << cur->_data << " "; while (cur&&cur->_rightTag == THREAD) { cur = cur->_right; cout << cur->_data << " "; } if (cur) { cur = cur->_right; } } } protected: void _CreatBinTreeThreading(BinTreeThingNode*&root, const char *&str) { if (*str!='#'&&*str!='\0') { root = new BinTreeThingNode(*str); _CreatBinTreeThreading(root->_left,++str); if (*str != '\0') { _CreatBinTreeThreading(root->_right,++str); } } } void _InOderThread(BinTreeThingNode*&cur, BinTreeThingNode*&prev) { if (cur) { _InOderThread(cur->_left, prev); //当前节点cur的前驱 if (cur->_left == NULL) { cur->_leftTag = THREAD; cur->_left = prev;//当前节点的前驱是上一节点 } //上一节点prev的后继 if (prev&&prev->_right == NULL) { prev->_rightTag = THREAD; prev->_right = cur;//上一节点的后继是当前节点 } prev = cur;//更新上一访问的节点 _InOderThread(cur->_right, prev); } } private: BinTreeThingNode*_root; };
void Test() { BinTreeThreading bt("123##4##56"); bt.InOderThread(); bt.InOderSort(); } int main() { Test(); system("pause"); return 0; }
相关文章推荐
- C++ Runtime Error :STL list "list iterator not incrementable"
- 学生成绩管理系统课程设计(C语言,链表实现)
- C++构造与析构函数中调用虚函数的问题
- 2014传智播客C++第三期基础班+就业班至9月份 完整版
- ICL Auto Vectorization
- 011--VS2013 C++ 斜角地图贴图
- C++实现String类
- c语言:编辑程序输出取数组地址
- c语言:编辑一个有趣的死循环程序并对其修改,仅仅是一个“=”号的差别
- c语言:有趣的printf输出,“4321”
- Cpp--next_permutation函数
- c语言:2种方法编程及优化;喝汽水问题
- GDAL中GDALDataType中值与其在C++中数据类型对应
- 如何获取Unix时间戳[C++]
- leetcode题库之257
- 初识c语言
- C语言动态申请内存
- c++中 cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- C++ Signal/Slot Library sigslot
- switch语句“error C2630: initialization of 'k' is skipped by 'case' label”编译错误