表达式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
原创粉丝点击