您的位置:首页 > 理论基础 > 数据结构算法

二叉树的建立、遍历、添加、销毁(...递归)

2012-12-25 17:14 363 查看
        近期看到一本书上有关于二叉树的例子, 于是就自己敲了一遍。一方面让

自己加深一下对二叉树中‘递归’的用法, 另一方面 方便 新手参考。

        如有不当请指正!

 

#include <iostream>
using namespace std;

typedef int NodeNum;  //记录二叉树中结点的个数

struct Node
{
Node(int elem)
{
m_elem = elem;
leftNode = NULL;
rightNode = NULL;
}
int m_elem;
Node* leftNode;
Node* rightNode;
};

class BinTree
{
public:

NodeNum m_nodeNum;
Node* m_rootNode;

BinTree(int nodeNum);
void InitialTree(NodeNum nodeNum);

void AddNode( int sourceNode, int addNodeNum);
bool AddNode(Node* pCurNode, int sourceNode, int addNodeNum);

void PrintTree();
void PrintTree(Node* pNode);

void DestoryTree();
void DestoryTree(Node* pNode);

};

BinTree::BinTree(int nodeNum)
:m_rootNode(NULL)
,m_nodeNum(0)
{
m_rootNode = new Node(0);   //初始化,根节点

m_nodeNum += 1;				//记录结点数,初始为1(只有一个根节点)
InitialTree(nodeNum);
}

void BinTree::InitialTree(NodeNum nodeNum)
{
if (nodeNum >0)
{
Node* pCurNode = m_rootNode;
for (int i = 1; i <= nodeNum; i++)
{
Node * pNode = new Node(i);
if (pCurNode->leftNode == NULL)  // 先添加左子树
{
pCurNode->leftNode = pNode;
m_nodeNum++;

}else if (pCurNode->rightNode == NULL) //左子树已存在,添加右子树
{
pCurNode->rightNode = pNode;
pCurNode = pCurNode->leftNode;  //若右子树添加成功,则记录下左子树, 以便下次添加结点
//(此时,左结点作为下次添加结点的父节点)
m_nodeNum++;
}
}
}

return;
}

void BinTree::AddNode( int fatherNode, int addNodeNum)
{
cout<<"在父结点"<<fatherNode<<", 上添加新结点-----------:  "<<addNodeNum<<endl;
if (AddNode(m_rootNode, fatherNode,   addNodeNum))
{
cout<<"添加成功..."<<endl;
return;
}
cout<<"添加失败..."<<endl;
return;
}

bool BinTree::AddNode(Node* pCurNode, int sourceNode, int addNodeNum)
{
if (pCurNode != NULL)
{
if (pCurNode->m_elem == sourceNode)
{
Node* pNewNode = new Node(addNodeNum);
if (pCurNode->leftNode == NULL)
{
pCurNode->leftNode = pNewNode;
m_nodeNum++;
return true;
}else if(pCurNode->rightNode == NULL)
{
pCurNode->rightNode = pNewNode;
m_nodeNum++;
return true;
}
}

if (!AddNode(pCurNode->leftNode, sourceNode, addNodeNum))
{
if (!AddNode(pCurNode->rightNode, sourceNode, addNodeNum) )
{
return false;
}
}
return true;
}

return false;
}

//打印二叉树
void BinTree::PrintTree()
{
cout<<"\n打印树..."<<endl;
PrintTree(m_rootNode);
return;
}

void BinTree::PrintTree(Node* pNode)
{

if (pNode == NULL)
{
return;
}

if (pNode != NULL)
{
cout<<pNode->m_elem<<endl;

PrintTree(pNode->leftNode);
PrintTree(pNode->rightNode);
}

}

void BinTree::DestoryTree()
{
cout<<"\n销毁树.....................[先左右后根节点]"<<endl;
if(m_rootNode != NULL)
{
DestoryTree(m_rootNode);
}

return;
}

void BinTree::DestoryTree(Node* pNode)
{
if(pNode != NULL)
{
DestoryTree(pNode->leftNode);
DestoryTree(pNode->rightNode);

cout<<"销毁的结点元素为: "<<pNode->m_elem<<endl;
delete pNode;
pNode = NULL;
}

return;
}

//////////////////////////////////////////////////////////////////////////
int main()
{

BinTree bt(10);  //初始化 10 个结点的二叉树
bt.PrintTree();  //打印初始的二叉树

bt.AddNode(10,11); //在结点(10)上添加结点
bt.AddNode(10,12);

bt.PrintTree();
bt.DestoryTree();  //销毁。 先销毁左右孩子结点,再销毁根结点

return 0;
}

 



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构二叉树
相关文章推荐