二叉树后序线索化以及后序遍历
来源:互联网 发布:excel怎么合并数据 编辑:程序博客网 时间:2024/06/01 16:16
构建节点:多了双亲节点
struct BinaryTreeNodeThd{BinaryTreeNodeThd(const T& data): _data(data), _pLeft(NULL), _pRight(NULL), _pParent(NULL), _LeftThread(LINK), _RightThread(LINK){}T _data;BinaryTreeNodeThd<T>* _pLeft;BinaryTreeNodeThd<T>* _pRight;BinaryTreeNodeThd<T>* _pParent;Info _LeftThread;Info _RightThread;};
后序线索化:先线索化左子树 再线索化右子树,最后线索化当前根节点
直接贴代码
void PostThread(){BinaryTreeNodeThd<T>* prev = NULL;_PostThread(_pRoot, prev);}void _PostThread(BinaryTreeNodeThd<T>* pRoot, BinaryTreeNodeThd<T>*& prev){if (pRoot){_PostThread(pRoot->_pLeft,prev);// 线索化左子树_PostThread(pRoot->_pRight,prev); //线索化右子树if (pRoot->_pLeft == NULL){pRoot->_LeftThread = THREAD;pRoot->_pLeft = prev;}if (prev && prev->_pRight == NULL){prev->_RightThread = THREAD;prev->_pRight = pRoot;}prev = pRoot;}}
后序遍历线索二叉树:
思路:(1)找到最左边的节点(分为两种情况 :存在右子树 ,不存在右子树)
(2)while循环一直遍历节点的后继(prev保存上一次访问的节点)注意左单支
跳出循环条件:当前节点有右子树或者可能到根节点
(3)跳出循环:判断是否为根节点:如果根节点没有右子树,直接访问return退出
(4)当前节点不为根节点,循环访问当前节点的双亲节点 注意右单支
(5)最后判断是否为有右子树,当前节点指向其右子树
代码:
void PostOrder(){_PostOrder(_pRoot);} void _PostOrder(BinaryTreeNodeThd<T>* pRoot) {BinaryTreeNodeThd<T>* pCur = pRoot; BinaryTreeNodeThd<T>* prev = NULL; //保存上一次访问的节点while (pCur){//找最左边的节点while (pCur->_LeftThread == LINK && pCur->_pLeft != prev) //防止陷入死循环 {pCur = pCur->_pLeft;} //跳出循环的条件:pCur为最左边的节点//访问节点的后继while (pCur && THREAD == pCur->_RightThread) // {cout << pCur->_data << " ";prev = pCur; //perv记录已经访问过的节点pCur = pCur->_pRight;}//跳出循环的条件:pCur为空(即左单支情况) 节点有右子树,节点为根节点//跳出循环,判断是否为根节点if (pCur == pRoot && pCur->_pRight == prev){cout << pCur->_data << " ";return;}//不是根节点,访问当前节点的双亲节点while (pCur && pCur->_pRight == prev) // 注意 右单支情况{cout << pCur->_data << " ";prev = pCur;pCur = pCur->_pParent;}// 判断根节点是否有右子树if (pCur && pCur->_RightThread == LINK){pCur = pCur->_pRight;}}}
代码测试分析:
测试代码:
void FunTest2(){char* pTreeInfo = "1245##6#7###3";BinaryTreeThd<char> bt(pTreeInfo, strlen(pTreeInfo));bt.PostThread();bt.PostOrder(); //结果:5764231}
测试一下特殊的右单支的情况:
分析右单支:注意(3)步
测试一下特殊的左单支:所以循环访问后继的时候需要加判断pCur是否为空
1 0
- 二叉树后序线索化以及后序遍历
- 二叉树线索化以及线索化的先序、中序、后序遍历
- 二叉树的线索化以及 线索化的先序,中序,后序遍历
- 二叉树线索化以及线索化前序、中序、后序遍历
- 二叉搜索树后序线索化+后序遍历C语言
- 中序线索化二叉树以及中序遍历线索化二叉树、倒中序遍历线索化二叉树
- 二叉树的线索化以及遍历(前序、中序、后序)
- 【C++】后序线索化二叉树及其遍历
- 后序线索化二叉树及遍历(图解)
- 后序二叉线索树的遍历
- 中序线索二叉树的创建、线索化和遍历(前序遍历和后序遍历)
- 先序遍历/后序遍历创建线索二叉树
- 【数据结构】中序线索化二叉树后实现一个迭代器来遍历二叉树
- 线索化二叉树&&线索化后的二叉树遍历
- 线索二叉树和中序非递归遍历线索化后的二叉树
- 二叉树线索化后 非递归遍历
- 中序、前序、后序遍历线索化二叉树
- 【详解】前、中、后序线索化二叉树及其遍历
- Web请求过程总结
- UML九大图
- BLE 广播、扫面、连接相关基础知识
- 剑指offer7——两个栈实现队列
- Visual Studio for Mac 安装&体验
- 二叉树后序线索化以及后序遍历
- STL 二分法 upper_bound()与lower_bound()使用方法
- 关于中值滤波算法,以及C语言实现
- html 表格和表单知识点
- eclipse工作空间配置--------新建菜单初始项
- Windows版本搭建安装React Native环境配置 count not find tools.jar问题
- 《构建之法》 第八章需求分析
- 利用OpenCV和C++实现由RGB图像转化为灰度图,再将灰度图转化为二值图的程序
- Hibernate 实体类 映射文件使用注解方式 经典报错以及解决方法