void bsTree<T>::remove(const T & item) { TNode<T> *tN = search(root, item); //Returns node of value, item. if(!tN) //if node is not found, remove nothing. return; TNode<T> *pN= tN->getParent(); //Points to tN's parent. if(tN->getLeft() == NULL && tN->getRight() == NULL) //node is leaf { removeLink(tN, pN, NULL); } else if(tN->hasOnlyLeft()) //Node has only left child { removeLink(tN, pN, tN->getLeft()); } else if(tN->hasOnlyRight()) //Node has only right child { removeLink(tN, pN, tN->getRight()); } else // has two children { if(tN->getValue() > root->getValue()) { getSmallest(tN->getRight(), tN, tN); } else { getBiggest(tN->getLeft(), tN, tN); } } }
std::shared_ptr<GNode> NextExtractor::converseAST(shared_ptr<CFG> cfg,TNode* curTNode, shared_ptr<GNode> curGNodeParent, shared_ptr<stack<shared_ptr<GNode>>> level) { if (curTNode == NULL){ return curGNodeParent; } string nodeType = curTNode->getNodeType(); //ignore procedure and stmtlst TNode if (nodeType == "STMTLST_NODE") { return converseAST(cfg, curTNode->getChild(0),curGNodeParent,level); } else if(nodeType=="PROC_NODE") { return converseAST(cfg, curTNode->getChild(0),curGNodeParent,level); } else if(nodeType=="THEN_NODE"){ return converseAST(cfg ,curTNode->getChild(0), curGNodeParent, level); } else if(nodeType=="ELSE_NODE"){ return converseAST(cfg ,curTNode->getChild(0), curGNodeParent, level); } else if(nodeType=="ASSIGN_NODE"){ shared_ptr<GNode> gNode = setlink(cfg, curTNode, curGNodeParent, level); return converseAST(cfg , curTNode->getRightSibling(), gNode, level); } else if(nodeType=="CALL_NODE"){ shared_ptr<GNode> gNode = setlink(cfg, curTNode, curGNodeParent, level); return converseAST(cfg , curTNode->getRightSibling(), gNode, level); } else if(nodeType=="IF_NODE"){ shared_ptr<GNode> gNode = setlink(cfg, curTNode, curGNodeParent, level); level->push(gNode); converseAST(cfg , curTNode->getChild(0), gNode, level); // converse then node gNode = converseAST(cfg, curTNode->getChild(0)->getRightSibling(), gNode, level); // converse else node nodeMap.insert(pair<int, shared_ptr<GNode>>(gNode->getStmtNum(), gNode)); if(lastIfWhileStmtStack.size() > 0 && lastIfWhileStmtStack.top().second == curTNode){ TNode* curTNodeParent = curTNode->getParent(); string curTNodeType = curTNode->getNodeType(); //this is for while-if code if(curTNodeParent->getNodeType() == "STMTLST_NODE" && curTNodeParent->getParent()->getNodeType().compare("WHILE_NODE") == 0) { cfg->setNext(gNode, level->top()); level->pop(); } //this is for if-if-LEFT code else if(curTNodeParent->getNodeType() == "STMTLST_NODE" && curTNodeParent->getParent()->getData().compare("then") == 0) { cout << "test" << endl; shared_ptr<GNode> nextG = make_shared<GNode>(INT_MIN, "EMPTY"); lastIfNode.insert(pair<int,shared_ptr<GNode>>(level->top()->getStmtNum(), nextG)); firstIfNode.insert(pair<shared_ptr<GNode> ,int>(nextG , level->top()->getStmtNum())); cfg->setNext(gNode,nextG); level->pop(); level->push(nextG); } //this is for if-if-RIGHT code else if(curTNodeParent->getNodeType() =="STMTLST_NODE" && curTNodeParent->getParent()->getData().compare("else") == 0) { shared_ptr<GNode> nextG = level->top(); cfg->setNext(gNode,level->top()); level->pop(); lastIfWhileStmtStack.pop(); return nextG; } lastIfWhileStmtStack.pop(); return gNode; } else { return converseAST(cfg,curTNode->getRightSibling(),gNode,level);//recursive !! curG is the empty node } } else if(nodeType=="WHILE_NODE") { shared_ptr<GNode> gNode = setlink(cfg, curTNode, curGNodeParent, level); level->push(gNode); converseAST(cfg, curTNode->getChild(0), gNode, level); //converse while node if(lastIfWhileStmtStack.size() > 0 && lastIfWhileStmtStack.top().second == curTNode){ TNode* curTNodeParent = curTNode->getParent(); string curTNodeType = curTNode->getNodeType(); //this is for while-while if(curTNodeParent->getNodeType() == "STMTLST_NODE" && curTNodeParent->getParent()->getNodeType().compare("WHILE_NODE") == 0) { cfg->setNext(gNode, level->top()); level->pop(); } //this is for if-while-LEFT code else if(curTNodeParent->getNodeType() == "STMTLST_NODE" && curTNodeParent->getParent()->getData().compare("then") == 0) { shared_ptr<GNode> nextG = make_shared<GNode>(INT_MIN, "EMPTY"); lastIfNode.insert(pair<int,shared_ptr<GNode>>(level->top()->getStmtNum(), nextG)); firstIfNode.insert(pair<shared_ptr<GNode>,int>(nextG , level->top()->getStmtNum())); cfg->setNext(gNode,nextG); level->pop(); level->push(nextG); } //this is for if-while-RIGHT code else if(curTNodeParent->getNodeType() == "STMTLST_NODE" && curTNodeParent->getParent()->getData().compare("else") == 0) { shared_ptr<GNode> nextG = level->top(); cfg->setNext(gNode,level->top()); level->pop(); lastIfWhileStmtStack.pop(); return nextG; } lastIfWhileStmtStack.pop(); return gNode; } else { return converseAST(cfg,curTNode->getRightSibling(),gNode,level);//recurTNodesive } }else{ return NULL; } }