2叉树遍历的递归实现-使用c++模板

来源:互联网 发布:sql获取当前时间 编辑:程序博客网 时间:2024/06/05 03:24

前言

2叉树的遍历, 为了效率, 不能用模板实现.
先用递归实现一个, 找找感觉.

测试程序

/// @file exam_x_x.cpp/// @brief 用递归实现2叉树遍历#include <iostream>#include <limits>#include "MyTree.h"using namespace std;void clear_cin();void fnTestTree();int main(int argc, char** argv, char** envp){    fnTestTree();    cout << "END, press any key to quit" << endl;    clear_cin();    getchar();    return 0;}void fnTestTree(){    // A + B*(C-D)/(E-F) - G    CMyTree<char> tree;    CMyTreeNode<char>* pRootNode = NULL;    CMyTreeNode<char>* pNodeCur = NULL;    CMyTreeNode<char>* pNodeTmp1 = NULL;    CMyTreeNode<char>* pNodeTmp2 = NULL;    CMyTreeNode<char>* pNodeTmp3 = NULL;    CMyTreeNode<char>* pNodeTmp4 = NULL;    CMyTreeNode<char>* pNodeTmp5 = NULL;    // C-D    pNodeTmp1 = tree.MakeNewNode('-');    tree.insertNode(pNodeTmp1, NODE_LEFT, 'C');    tree.insertNode(pNodeTmp1, NODE_RIGHT, 'D');    // E-F     pNodeTmp2 = tree.MakeNewNode('-');    tree.insertNode(pNodeTmp2, NODE_LEFT, 'E');    tree.insertNode(pNodeTmp2, NODE_RIGHT, 'F');    // B*(C-D)    pNodeTmp3 = tree.MakeNewNode('*');    tree.insertNode(pNodeTmp3, NODE_LEFT, 'B');    tree.insertNode(pNodeTmp3, NODE_RIGHT, pNodeTmp1);    // B*(C-D)/(E-F)    pNodeTmp4 = tree.MakeNewNode('/');    tree.insertNode(pNodeTmp4, NODE_LEFT, pNodeTmp3);    tree.insertNode(pNodeTmp4, NODE_RIGHT, pNodeTmp2);    // A + B*(C-D)/(E-F)    pNodeTmp5 = tree.MakeNewNode('+');    tree.insertNode(pNodeTmp5, NODE_LEFT, 'A');    tree.insertNode(pNodeTmp5, NODE_RIGHT, pNodeTmp4);    // A + B*(C-D)/(E-F) - G    pRootNode = tree.insertRootNode('-');    tree.insertNode(pRootNode, NODE_LEFT, pNodeTmp5);    tree.insertNode(pRootNode, NODE_RIGHT, 'G');    // - + A / * B - C D - E F G    tree.printTree_DLR(tree.getRootNode());    printf("\n");    // A + B * C - D / E - F - G    tree.printTree_LDR(tree.getRootNode());    printf("\n");    // A B C D - * E F - / + G -    tree.printTree_LRD(tree.getRootNode());    printf("\n");    // A + B*(C-D)/(E-F) - G    // 后序遍历表达式的模拟计算    // A B C D - * E F - / + G -    // A B (C-D) * E F - / + G -    // A B*(C-D) E F - / + G -    // A B*(C-D) (E-F) / + G -    // A B*(C-D)/(E-F) + G -    // A+B*(C-D)/(E-F) G -}   // A+B*(C-D)/(E-F)-Gvoid clear_cin(){    cin.clear();    cin.sync();}

模板实现的2叉树

// MyTree.h: interface for the CMyTree class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_)#define AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define NODE_LEFT true#define NODE_RIGHT falsetemplate<typename T>class CMyTreeNode{public:    CMyTreeNode()        : m_Element((T)0)        , m_pParent(NULL)        , m_pChildLeft(NULL)        , m_pChildRight(NULL)    {}    ~CMyTreeNode() {}    T m_Element; ///< 元素    CMyTreeNode* m_pParent; ///< 父节点    CMyTreeNode* m_pChildLeft; ///< 左孩子结点    CMyTreeNode* m_pChildRight; ///< 右孩子结点};template<typename T>class CMyTree  {public:    CMyTree() : m_pRoot(NULL) {}    virtual ~CMyTree() {free(m_pRoot);}    CMyTreeNode<T>* insertRootNode(T Element);    CMyTreeNode<T>* MakeNewNode(T Element);    CMyTreeNode<T>* insertNode(CMyTreeNode<T>* pNode, bool isLeft, T Element);    CMyTreeNode<T>* insertNode(CMyTreeNode<T>* pNode, bool isLeft, CMyTreeNode<T>* pNodeChildExist);    CMyTreeNode<T>* getRootNode() {return m_pRoot;}    void printTree_DLR(CMyTreeNode<T>* pTreeNode); ///< 前序-遍历打印    void printTree_LDR(CMyTreeNode<T>* pTreeNode); ///< 中序-遍历打印    void printTree_LRD(CMyTreeNode<T>* pTreeNode); ///< 后序-遍历打印    void free(CMyTreeNode<T>* pTreeNode); ///< 释放资源private:    CMyTreeNode<T>* m_pRoot;};template<typename T>void CMyTree<T>::free(CMyTreeNode<T>* pTreeNode){    /// 按照LRD后序释放资源合理    if (NULL != pTreeNode)    {        if (NULL != pTreeNode->m_pChildLeft)            free(pTreeNode->m_pChildLeft);                if (NULL != pTreeNode->m_pChildRight)            free(pTreeNode->m_pChildRight);                if (NULL != pTreeNode->m_pParent)            pTreeNode->m_pParent = NULL;        delete pTreeNode;        pTreeNode = NULL;    }}template<typename T>void CMyTree<T>::printTree_DLR(CMyTreeNode<T>* pTreeNode){    if (NULL != pTreeNode)    {        cout << pTreeNode->m_Element << " ";        printTree_DLR(pTreeNode->m_pChildLeft);        printTree_DLR(pTreeNode->m_pChildRight);    }}template<typename T>void CMyTree<T>::printTree_LDR(CMyTreeNode<T>* pTreeNode){    if (NULL != pTreeNode)    {        if (NULL != pTreeNode->m_pChildLeft)            printTree_LDR(pTreeNode->m_pChildLeft);        cout << pTreeNode->m_Element << " ";        if (NULL != pTreeNode->m_pChildRight)            printTree_LDR(pTreeNode->m_pChildRight);    }}template<typename T>void CMyTree<T>::printTree_LRD(CMyTreeNode<T>* pTreeNode){    if (NULL != pTreeNode)    {        if (NULL != pTreeNode->m_pChildLeft)            printTree_LRD(pTreeNode->m_pChildLeft);        if (NULL != pTreeNode->m_pChildRight)            printTree_LRD(pTreeNode->m_pChildRight);                cout << pTreeNode->m_Element << " ";    }}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertRootNode(T Element){    if (NULL == m_pRoot)    {        m_pRoot = new CMyTreeNode<T>;        m_pRoot->m_Element = Element;    }    return m_pRoot;}template<typename T>CMyTreeNode<T>* CMyTree<T>::MakeNewNode(T Element){    CMyTreeNode<T>* pNewNode = new CMyTreeNode<T>;    pNewNode->m_Element = Element;        return pNewNode;}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertNode(CMyTreeNode<T>* pNode, bool isLeft, T Element){    CMyTreeNode<T>* pNodeChild = NULL;    if (NULL != pNode)    {        pNodeChild = new CMyTreeNode<T>;        pNodeChild->m_Element = Element;        pNodeChild->m_pParent = pNode;        if (isLeft)            pNode->m_pChildLeft = pNodeChild;        else            pNode->m_pChildRight = pNodeChild;    }        return pNode;}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertNode(CMyTreeNode<T>* pNode, bool isLeft, CMyTreeNode<T>* pNodeChildExist){    if (NULL != pNode)    {        if (NULL != pNodeChildExist)            pNodeChildExist->m_pParent = pNode;        if (isLeft)            pNode->m_pChildLeft = pNodeChildExist;        else            pNode->m_pChildRight = pNodeChildExist;    }        return pNodeChildExist;}#endif // !defined(AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_)






0 0
原创粉丝点击