奋斗一会儿
http://www.imooc.com/article/13384
慕移动1272676
#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]<<" ";
}
}
weixin_慕运维0044477
最后的delete []pTree,改成delete pTree.../(ㄒoㄒ)/~~
就只能这样了
知道了,后面写着delete []pTree,改成delete pTree,程序好了,可是因为不是数组,记错了
Oh_Superman
你都没有包含tree.cpp文件
慕斯5158549
···
程序猿小萌新
根据作者对于AddNode的写法,只有根节点所含元素不为0时,才可以加入子节点,所以根节点必须赋一个非零数
3117000422廖道洋
VS, VC6, VC5.4都可以
ziorm
main.cpp中,你定义的pTree是一个指针,不是数组指针,最后你删除的时候就不用删除数组噻,delete pTree就好了
如烟风云
是的,删除父节点(0节点)),就是要把整棵树中的所有数据删除,并归还内存
删除父次父节点(1/2节点),就是要把左(右)树的数据全部删除并归还内存
梦幻ldf
用new实例化对象时没有括号
Tree *tree=new Tree();
胡离
你的代码在遍历那里有错啊,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++)。这样就好了
qq_CalmCRAZY_04211902
坏男孩儿
从堆中申请内存啊!~~
受惊的鸵鸟
你的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;
}