如果删除根节点要把后面的子节点也删掉吧,使用递归:int leftPos = nodeIndex*2 + 1;
int rightPos = nodeIndex*2 + 2;
int temp = 0;
if(leftPos <= m_iSize && m_pTree[leftPos] != 0){
DeleteNode(leftPos,&temp);
}
if(rightPos <= m_iSize && m_pTree[rightPos] != 0){
DeleteNode(rightPos,&temp);
}
int rightPos = nodeIndex*2 + 2;
int temp = 0;
if(leftPos <= m_iSize && m_pTree[leftPos] != 0){
DeleteNode(leftPos,&temp);
}
if(rightPos <= m_iSize && m_pTree[rightPos] != 0){
DeleteNode(rightPos,&temp);
}
2016-10-15
做了人生中第一次有意义的debug,有问题,耐心一点,一层层剥开,终会找到bug!
把void Node::DeleteNode()中的代码:this->pParent->pRChild = NULL;写成了this->pParent->pParent=NULL,因此删除结点6时,采用后序遍历,第五次当要访问结点6的双亲结点2时就出现了问题,发生访问冲突!(我排查到了DeleteNode有问题,但编译通过,逻辑有问题,怪不得一直没有查出来!)
把void Node::DeleteNode()中的代码:this->pParent->pRChild = NULL;写成了this->pParent->pParent=NULL,因此删除结点6时,采用后序遍历,第五次当要访问结点6的双亲结点2时就出现了问题,发生访问冲突!(我排查到了DeleteNode有问题,但编译通过,逻辑有问题,怪不得一直没有查出来!)
2016-10-10
在构造时全部初始化为0会影响AddNode()中节点是否存在的判断啊,我插入编译运行结果是 3 0 0 0 0 0 0 0 0 0,
注释掉才正常
注释掉才正常
2016-10-07
有个疑问,在AddNode函数中,如果查找到该索引的结点已经有左右子结点了,此时我调用AddNode,direction为0,那么函数内部直接将该结点的左子节点指向新结点,这样是否会造成原来的左子结点内存泄漏?此时函数内是否应该添加一个判断,当结点有左右子结点时,直接返回添加失败?
2016-09-27
最赞回答 / 慕姐3585284
是的,就是如此。James老师这个树篇讲得不太好。而且也没有讲BST,平衡二叉树等较深入较实用的知识。。。o(╯□╰)o希望他后面能补上吧。。。
2016-09-27