大都的语言语法都有相同之处,很好学的
课程里回抛为了打印日志,如果没有需要,可以不回抛的
那是你加的引入太多了
应该是:SearchNode()没找到,temp为空指针
我的理解是第一种只是声明了一个指针p,该指针用来存储类A的地址,但并没有指向哪一个具体类,因为没有给他开辟可用的类A的空间。第二种是声明指针q的同时还在堆中开辟了一个新的可用的类A空间,并将该空间的起始地址赋值给q,相当于第一种形式的A *p;p=new A();这是我个人的理解,小白还望大佬指点?
希望大神能解释下
没有递归
看花了 不好意思,代码中有delete
你看看你的DeleteNode()函数有没有问题,找不到的话可以贴出代码
http://www.imooc.com/article/13384
不好意思刷个积分哈哈哈哈
这是一个递归的调用,删除顺序是左右本身 如 可以将一个深度两层以上的数视为
根
左树 右树
删左树时一样直到一个树只有2层 删除本身后,他又是另外一个更大的树的左树,然后删那个更大的树的右树
以此类推,递归
#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]<<" ";
}
}
不加的话return &m_pTree[nodeIndex];这句话无法返回出我们要搜索的那个节点的地址
我觉得这代码有问题吧,视频中删除的最右边那个节点,按照这个搜寻方法,当遍历到最左边这个节点时,此时this指的是最左边的指针,这样他肯定不会进入第二个if语句
添加结点的前提是这个结点没有子结点
你Tree的头文件应该有问题,对照看一下。
最后的delete []pTree,改成delete pTree.../(ㄒoㄒ)/~~
他留了个错误,看完最后一节,老师会修改成递归
重点在于使用的对象。
如果对象是用Node实例化,调用的就是Node.h里面的SearchNode()函数
如果对象是用Tree实例化,调用的就是Tree.h里面的SearchNode()函数
=》滑稽
左节点如果不为NULL, 且不失要找的节点, 就让左节点继续找它的左右子节点。这个是递归调用
好好看Tree.h,里面写了 private: Node *m_pRoot; m_pRoot是Node类,它所指的成员函数当然是Node类下的SearchNode。
建议你好好动手写一遍代码,光看是不解决问题的
你的AddNode方法里的判断是不是判断为 if(newIndex == 0) 了?
参照上楼 可用sturct结构
我的理解是,如果pNode==NULL,就相当于pNode这个结点不存在,就更不存在
pNode -> data = temp -> data
这一步了。
pNode就是把要删除的那个结点的内容保存下来的结点
https://blog.csdn.net/zxnsirius/article/details/52131433