表达式2叉树(前序,中序,后序)的非递归实现_优化1
来源:互联网 发布:北京飞客数据恢复中心 编辑:程序博客网 时间:2024/06/05 06:48
前言
对 printTree_DLR_ex, printTree_LDR_ex, printTree_LRD_ex 进行优化
减少了栈的使用, 现在只用1个栈.
优化后的函数实现
函数定义
/// 用非递归实现遍历 void printTree_DLR_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb); ///< 前序-遍历打印 void printTree_LDR_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb); ///< 中序-遍历打印 void printTree_LRD_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb); ///< 后序-遍历打印
函数实现
void CMyTree::printTree_DLR_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb){ CLsStack<CMyTreeNode*> stack; if (NULL != pTreeNode) stack.push(pTreeNode); while (!stack.isEmpty()) { pTreeNode = stack.pop(); if (NULL != pTreeNode) { if (NULL != pfnCb) pfnCb(pTreeNode->m_Element); if (NULL != pTreeNode->m_pChildRight) stack.push(pTreeNode->m_pChildRight); if (NULL != pTreeNode->m_pChildLeft) stack.push(pTreeNode->m_pChildLeft); } }}void CMyTree::printTree_LDR_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb){ CLsStack<CMyTreeNode*> stack; while ((NULL != pTreeNode) || !stack.isEmpty()) { if (NULL != pTreeNode) { stack.push(pTreeNode); pTreeNode = pTreeNode->m_pChildLeft; } else { pTreeNode = stack.pop(); if (NULL != pfnCb) (*pfnCb)(pTreeNode->m_Element); pTreeNode = pTreeNode->m_pChildRight; } }}void CMyTree::printTree_LRD_ex(CMyTreeNode* pTreeNode, PFN_CALLBACK_PRINT_TREE pfnCb){ bool isNodeNoAnyChild = false; ///< 是树叶 bool isNodeNoRightChild = false; ///< 没有右孩子或右孩子已经遍历过 CLsStack<CMyTreeNode*> stack; CMyTreeNode* pLastNode = NULL; while (1) { /// 遍历并压栈当前结点到当前结点的最后一个左孩子 while (NULL != pTreeNode) { stack.push(pTreeNode); pTreeNode = pTreeNode->m_pChildLeft; } if (stack.isEmpty()) break; pTreeNode = stack.pop(); isNodeNoAnyChild = ((NULL == pTreeNode->m_pChildLeft) && (NULL == pTreeNode->m_pChildRight)); isNodeNoRightChild = ((NULL == pTreeNode->m_pChildRight) || (pTreeNode->m_pChildRight == pLastNode)); if (isNodeNoAnyChild || isNodeNoRightChild) { /// 符合LRD遍历操作当前结点的条件 /// 如果是叶子, 执行回调 /// 如果没有右孩子或右孩子已经遍历过, 执行回调 if (NULL != pfnCb) (*pfnCb)(pTreeNode->m_Element); pLastNode = pTreeNode; ///< ! pTreeNode = NULL; ///< ! } else { /// 当前结点入栈, 当前结点变为右孩子 if (NULL != pTreeNode) { stack.push(pTreeNode); pTreeNode = pTreeNode->m_pChildRight; } } }}
0 0
- 表达式2叉树(前序,中序,后序)的非递归实现_优化1
- 表达式2叉树(前序,中序,后序)的非递归实现_模板实现
- 非递归实现前序、中序、后序遍历
- 前序-中序-后序-非递归-实现
- 二叉树的前序、中序、后序的实现(递归和非递归)
- java实现树的前序,中序,后序的递归和非递归遍历
- 树的前序,中序,后序遍历的递归以及非递归实现
- 二叉树非递归前、中、后序遍历实现
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 前序 中序 后序遍历的递归和非递归实现
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 前序,中序,后序遍历的非递归
- BroadcastReceiver 的简单应用
- 串匹配算法之KMP算法
- Python Scopes and Namespaces
- TCP Socket和ZeroMQ socket的区别
- 【WEB前端】1.CSS浮动相关
- 表达式2叉树(前序,中序,后序)的非递归实现_优化1
- javascript类型系统之String
- 时间的朋友-读后
- 图表Amchart实践
- UI课程(Wechat)
- 机架和电机的选择
- C++学习之Pair
- 如何将一个Android项目使用本地服务器运行
- UI基础 - 简易的加法计算器实现