递归遍历二叉树代码实例
来源:互联网 发布:电脑唱歌评分软件 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 递归遍历二叉树代码实例
- 二叉树遍历非递归的代码
- 非递归前序遍历二叉树-代码实例讲解
- 非递归中序遍历二叉树-代码实例讲解
- 二叉树的遍历(代码递归和数据递归)
- 二叉树各种遍历-递归及非递归代码
- 循环遍历二叉树代码实例
- 二叉树递归遍历
- 二叉树遍历(递归)
- 二叉树递归遍历
- 递归遍历二叉树
- 递归二叉树遍历
- 二叉树递归遍历
- 递归遍历二叉树
- 二叉树递归遍历
- 二叉树的递归、迭代遍历的模板代码
- 非递归实现二叉树遍历(思路+代码)
- 二叉树非递归遍历复习代码实现
- #!/usr/bin/env python与#!/usr/bin/python的区别
- 3D图形变换中为什么使用四维矩阵,而不是三维矩阵?
- bigchainDB安装
- android 架构探索,浅谈mvp!
- 属于动态图的未来:横向对比PyTorch与Keras
- 递归遍历二叉树代码实例
- 如何像阿里工程师一样高效办公?
- Thread和Runnable的实现
- 安装jenkins
- java.lang.IllegalArgumentException: Illegal pattern character 'Y' 解决办法
- 第六周(1) 后台代码编写与客户端具体功能实现以及界面优化
- 欢迎使用CSDN-markdown编辑器
- Jquery实现 RadioButton做必选校验
- 【代码积累】UDP client