递归遍历二叉树代码实例

来源:互联网 发布:电脑唱歌评分软件 编辑:程序博客网 时间:2024/06/06 04:45

递归遍历二叉树

#include<iostream>#include<memory.h>using namespace std;template<class Type>                                               //定义模板class CBinaryTree {private:    Type *m_pRootNode;                                             //根节点    int m_nNodeCount;                                              //节点数目public:    CBinaryTree() {                                                 //析构函数创建根节点并初始化二叉树        m_pRootNode = new Type();        m_nNodeCount = 1;        InitBinaryTree();    }    Type* GetRootNode() const {                                     //获取根节点方法        return m_pRootNode;    }    void InitBinaryTree() {                                         //初始化二叉树方法        Type* pTmpNode = m_pRootNode;        for (int i = 1;i <= 10;i++) {                               //创建10个节点            Type* pNode = new Type();            pNode->m_nData = i;        label:            bool bRet = AddNode(pTmpNode, pNode, 0);                //添加左子节点,添加成功true,失败false            if (!bRet) {                                            //添加左子节点失败                bRet = AddNode(pTmpNode, pNode, 1);                 //添加右子节点            }            if (!bRet) {                                            //添加左右子节点均失败,即左右子节点均不为空                pTmpNode = pTmpNode->m_pLeftNode;                   //指针指向当前结点的左子节点                goto label;            }        }    }    void IterateBinaryTree(Type* pNode) {                           //递归遍历二叉树        if (pNode != NULL) {                                        //判断当前结点是否不为空            cout << "节点数据" << pNode->m_nData << endl;        }        if (pNode->m_pLeftNode != NULL) {                           //判断当前结点左子节点是否不为空            IterateBinaryTree(pNode->m_pLeftNode);                  //从当前结点左子节点开始遍历        }        if (pNode->m_pRightNode != NULL) {                          //判断当前结点右子节点是否不为空            IterateBinaryTree(pNode->m_pRightNode);                 //从当前结点右子节点开始遍历        }    }    bool AddNode(Type* pDestation, Type* pNode, int nFlag = 0) {    //添加节点方法,nFlag判断添加左右子节点        if (pDestation != NULL&&pNode != NULL) {                               if (nFlag) {                                            //nFlag=1,添加右子节点                if (!pDestation->m_pRightNode) {                    //判断右子节点是否为空,为空则添加                    pDestation->m_pRightNode = pNode;                }                else {                    return false;                                   //添加失败返回false                }            }            else {                                                  //nFlag=0,添加左子节点                if (!pDestation->m_pLeftNode) {                     //判断左子节点是否为空,为空则添加                    pDestation->m_pLeftNode = pNode;                }                else {                    return false;                                   //添加失败返回false                }            }            m_nNodeCount++;                                         //添加成功节点数目加1            return true;        }        return false;                                               //添加失败    }    void DestoryBinaryTree(Type* pNode) {                           //释放二叉树节点方法        Type *pLeftNode, *pRightNode;        if (pNode != NULL) {                                        //需要释放的节点不为空            pLeftNode = pNode->m_pLeftNode;                         //pLeftNode指向当前结点左子节点            pRightNode = pNode->m_pRightNode;                       //pRightNode指向当前结点右子节点            delete pNode;                                           //释放当前节点            pNode = NULL;            if (pLeftNode != NULL) {                                    //判断当前结点左子节点是否不为空                DestoryBinaryTree(pLeftNode);                           //以当前结点左子节点作为父节点进行遍历释放            }            if (pRightNode != NULL) {                                   //判断当前结点右子节点是否不为空                DestoryBinaryTree(pRightNode);                          //以当前结点右子节点作为父节点进行遍历释放            }        }    }    virtual ~CBinaryTree() {                                         //析构函数用来释放二叉树节点        DestoryBinaryTree(m_pRootNode);    }};class CNode {                                                     //定义节点类型private:    CNode *m_pLeftNode;                                           //左子节点    CNode *m_pRightNode;                                          //右子节点    int m_nData;                                                  //节点数据public:    CNode() {        m_pLeftNode = NULL;        m_pRightNode = NULL;        m_nData = 0;    }    virtual ~CNode() {        m_pLeftNode = NULL;        m_pRightNode = NULL;        m_nData = 0;    }    friend class CBinaryTree<CNode>;                               //申明CBinaryTree为友元类};int main(int argc, char argv[]) {    CBinaryTree<CNode> BinaryTree;    BinaryTree.IterateBinaryTree(BinaryTree.GetRootNode());    return 0;}