http://www.imooc.com/article/13384
#include <iostream>
#include "Tree.h"
using namespace std;
Tree::Tree(int size)
{
m_iSize=size;
m_pTree=new int[size];
for(int i=0; i<size; i++)
{
m_pTree[i]=0;
}
}
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<0||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<0||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]<<" ";
}
}
最后的delete []pTree,改成delete pTree.../(ㄒoㄒ)/~~
知道了,后面写着delete []pTree,改成delete pTree,程序好了,可是因为不是数组,记错了
你都没有包含tree.cpp文件
···
根据作者对于AddNode的写法,只有根节点所含元素不为0时,才可以加入子节点,所以根节点必须赋一个非零数
VS, VC6, VC5.4都可以
main.cpp中,你定义的pTree是一个指针,不是数组指针,最后你删除的时候就不用删除数组噻,delete pTree就好了
是的,删除父节点(0节点)),就是要把整棵树中的所有数据删除,并归还内存
删除父次父节点(1/2节点),就是要把左(右)树的数据全部删除并归还内存
你的代码在遍历那里有错啊,for(int i=0;i<=m_iSize;i++)这里去掉等于号for(int i=0;i<m_iSize;i++),还有构造函数那里for(int i;i<size;i++)的i要初始化for(int i=0;i<size;i++)。这样就好了
从堆中申请内存啊!~~
你的node1,node2的增加不对,看下前面的代码
在Tree类中定义一个void DiGui(int nodeIndex);方法来递归删除左右节点:
void Tree::DiGui(int nodeIndex)
{
int currentNodeIndex = nodeIndex;
if(nodeIndex * 2 + 1 < m_iSize)
{
nodeIndex = nodeIndex * 2 + 1;
m_pTree[nodeIndex] = 0;
DiGui(nodeIndex);
}
if(currentNodeIndex * 2 + 2 < m_iSize)
{
currentNodeIndex = currentNodeIndex * 2 + 2;
m_pTree[currentNodeIndex] = 0;
DiGui(currentNodeIndex);
}
}
在bool DeleteNode(int nodeIndex, int *pNode);方法中实现:
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;
DiGui(nodeIndex);
return true;
}