//递归遍历二叉树
// 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;
}
// 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;
}