递归遍历二叉树

//递归遍历二叉树
// BinaryTree.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
#include <memory>
using namespace std;


template<class Type>//定义二叉树类模板
class CBinaryTree
{
private:
int m_nNodeCount; //节点数量
Type * m_pRootNode; //根节点
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 < 11; i++) //添加十个节点
{
Type *pNode = new Type;
pNode->m_nData = i;
label: bool bRet = AddNode(pTmpNode,pNode,0); //添加左节点
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) //节点添加数据
{
if (nFlag) //添加右节点
{
if (!pDestation->m_pRightNode)
pDestation->m_pRightNode = pNode;
else                    //pDestation已经有了左节点??????????????????
return false;
}
else           //添加左节点
{
if (!pDestation->m_pLeftNode)
pDestation->m_pLeftNode = pNode;
else                    //pDestation已经有了右节点
return false;
}
m_nNodeCount++;
return true;
}


void DestroyBinaryTree(Type * pNode) //释放二叉树节点
{
Type* pLeftNode=NULL, *pRightNode=NULL;
if (pNode != NULL) //如果节点不为空
{
pLeftNode = pNode->m_pLeftNode;//记录左子节点
pRightNode = pNode->m_pRightNode;//记录右子节点
delete pNode;//释放当前节点
pNode = NULL;
}
if (pLeftNode != NULL) //如果左子节点不为空
{
DestroyBinaryTree(pLeftNode);
}
if (pRightNode != NULL) //如果右子节点不为空
{
DestroyBinaryTree(pRightNode);
}
}


virtual ~CBinaryTree() //析构函数
{
DestroyBinaryTree(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;
}
friend class CBinaryTree<CNode>; //将CBinary声明为友元类
virtual ~CNode()
{
m_pLeftNode = NULL;
m_pRightNode = NULL;
m_nData = 0;
}
};






int _tmain(int argc, _TCHAR* argv[])
{
CBinaryTree<CNode> BinaryTree; //定义二叉树对象
BinaryTree.IterateBinaryTree(BinaryTree.GetRootNode()); //递归遍历二叉树
cin.get();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值