/* 二叉树(数组表示)
完成树的基本操作:
1.树的创建和撤销
2.树中结点的搜索
3.树中结点的添加与删除
4.树中结点的遍历
BOOL CreateTree(Tree **pTree,Node *pRoot); //创建树
void DestroyTree(Tree *pTree); //撤消树
Node *SearchNode(Tree *pTree,int nodeIndex); //根据索引寻找结点
BOOL AddNode(Tree *pTree,int nodeIndex,int direction,Node *pNode);//添加结点
BOOL DeleteNode(Tree *pTree,int nodeIndex,Node *pNode); //删除结点
void TreeTraverse(Tree *pTree);
关于数组与树之间的算法转换
int tree[n] 3 5 8 2 6 9 7 父亲结点下标*2+1 该结点左
父亲结点下标*2+2 该结点右
3(0)
5(1) 8(2)
2(3) 6(4) 9(5) 7(6)
*/
/*********************************************************************/
//Tree.h
#ifndef TREE_H
#define TREE_H
class Tree
{
public:
Tree(int size,int *pRoot); //创建树
~Tree(); //撤消树
int *SearchNode(int nodeIndex); //根据索引寻找结点
bool AddNode(int nodeIndex,int direction,int *pNode); //添加结点
bool DeleteNode(int nodeIndex,int *pNode); //删除结点
void TreeTraverse(); //遍历结点
private:
int *m_pTree;
int m_iSize;
};
#endif // TREE_H
//Tree.cpp
#include "Tree.h"
#include <iostream>
using namespace std;
Tree::Tree(int size,int *pRoot)
{
m_iSize = size;
m_pTree = new int[size];
for(int i = 0;i<size;i++)
{
m_pTree[i] = 0;
}
m_pTree[0] = *pRoot;
}
Tree::~Tree()
{
delete []m_pTree;
m_pTree = NULL;
}
int *Tree::SearchNode(int nodeIndex)
{
if(nodeIndex<0||nodeIndex>=m_iSize)
{
return NULL;
}
if(m_pTree[nodeIndex]==0)
{
return NULL;
}
return &m_pTree[nodeIndex];
}
bool Tree::AddNode(int nodeIndex,int direction,int *pNode)
{
if(nodeIndex<0||nodeIndex>=m_iSize)
{
return false;
}
if(m_pTree[nodeIndex]==0)
{
return false;
}
if(direction == 0)
{
if(nodeIndex*2+1>=m_iSize)
{
return false;
}
if(m_pTree[nodeIndex*2+1]!=0)
{
return false;
}
m_pTree[nodeIndex*2+1] = *pNode;
}
if(direction==1)
{
if(nodeIndex*2+2>=m_iSize)
{
return false;
}
if(m_pTree[nodeIndex*2+2]!=0)
{
return false;
}
m_pTree[nodeIndex*2+2] = *pNode;
}
return true;
}
bool Tree::DeleteNode(int nodeIndex,int *pNode)
{
if(nodeIndex<0||nodeIndex>=m_iSize)
{
return false;
}
if(m_pTree[nodeIndex]==0)
{
return false;
}
*pNode = m_pTree[nodeIndex];
m_pTree[nodeIndex] = 0;
return true;
}
void Tree::TreeTraverse()
{
for(int i = 0;i<m_iSize;i++)
{
cout<<m_pTree[i]<<" ";
}
}
//main.cpp
#include <iostream>
using namespace std;
#include "Tree.h"
int main()
{
int root = 3;
Tree *pTree = new Tree(10,&root);
int node1 = 5;
int node2 = 8;
pTree->AddNode(0,0,&node1);
pTree->AddNode(0,1,&node2);
int node3 = 2;
int node4 = 6;
pTree->AddNode(1,0,&node3);
pTree->AddNode(1,1,&node4);
int node5 = 9;
int node6 = 7;
pTree->AddNode(2,0,&node5);
pTree->AddNode(2,1,&node6);
int node = 0;
pTree->DeleteNode(6,&node);
cout<<"node="<<node<<endl;
pTree->TreeTraverse();
int *p = pTree->SearchNode(2);
cout<<endl<<"node="<<*p<<endl;
delete pTree;
return 0;
}