bool LevelSelectMainUpdate() { if (!LevelUpdate()) { s3eDebugTracePrintf("Level Select Update returned false, exiting.."); return false; } if (g_ClearScreen) { LevelRender(); } //s3eSurfaceShow(); s3eDeviceYield(FRAMETIME); return true; }
void BiSortTree::DelItem(int x)//讨论节点是否是根节点或者分支节点 { //根节点直接删除,分支节点要使用左子树的最右节点或者右子树的最左节点替换被删除节点的 BiTree *p,*q,*pre,*father=NULL; bool LR=false; p=root; while(true){ if(p->value->key==x) break; father=p; if(p->value->key>x){ p=p->left; LR=false; } else{ p=p->right; LR=true; } ChainAdd(father,LR); }//完全是SearchBi函数内容,但是直接调用结果不同,因为要得到是父节点和该节点 if(p->left==NULL&&p->right==NULL){//叶节点 if(father!=NULL) LR?father->right=NULL:father->left=NULL; else //若为NULL表明要删除节点是根节点 root=NULL; } else{//分支节点 if(p->left!=NULL){ //删除节点后调整 q=p->left; pre=p; //pre由于是q父节点,故初始化为p,而不是q while(q->right!=NULL){//q最左节点 pre是q的父节点 pre=q; q=q->right; ChainAdd(pre,true); } if(pre!=p){ pre->right=NULL; q->left=p->left; }//pre==p表明左子树没有右节点即左节点是最右节点 q->right=p->right; } else{ q=p->right; pre=p; while(q->left!=NULL){//最右节点,pre是q的父节点 pre=q; q=q->left; ChainAdd(pre,false); } if(pre!=p){ pre->left=NULL; q->right=p->right; }//pre==p表明右子树没有左节点即右节点是最左节点 } q->Bla=p->Bla; if(father!=NULL) //若为NULL表明要删除节点是根节点 LR?father->right=q:father->left=q; //调整父节点 else root=q; } BlanceDel(); ChainDel(); count--;//注意删除节点时层次是否变化未知,需要重新更新一下 DelVert(p); LevelUpdate(); }