BinaryNode<ItemType>* copyTree(const BinaryNode<ItemType>* treePtr) const {
     BinaryNode<ItemType>* newTreePtr = nullptr;
     if (treePtr != nullptr) {
         newTreePtr = new BinaryNode<ItemType>(treePtr->getItem(), nullptr, nullptr);
         newTreePtr->setLeftChildPtr(copyTree(treePtr->getLeftChildPtr()));
         newTreePtr->setRightChildPtr(copyTree(treePtr->getRightChildPtr()));
     }
     return newTreePtr;
 }
    BinaryNode<ItemType>* rightRotate(BinaryNode<ItemType>* y) {
        BinaryNode<ItemType>*  x = y->getLeftChildPtr();
        BinaryNode<ItemType>* T2 = x->getRightChildPtr();

        x->setRightChildPtr(y);
        y->setLeftChildPtr(T2);

        y->setHeight(max(height(y->getLeftChildPtr()), height(y->getRightChildPtr()))+1);
        x->setHeight(max(height(x->getLeftChildPtr()), height(x->getRightChildPtr()))+1);

        return x;
    }
Beispiel #3
0
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::copyTree(const BinaryNode<ItemType>* treePtr) const
{
   BinaryNode<ItemType>* newTreePtr = nullptr;
   
   // Copy tree nodes during a preorder traversal
   if (treePtr != nullptr)
   {
      // Copy node
	   newTreePtr = new BinaryNode<ItemType>(treePtr->getItem(), nullptr, nullptr);
	   newTreePtr->setLeftChildPtr(copyTree(treePtr->getLeftChildPtr()));
      newTreePtr->setRightChildPtr(copyTree(treePtr->getRightChildPtr()));
   }  // end if
   
   return newTreePtr;
}  // end copyTree
Beispiel #4
0
void BST::remove(int x)
{
	    /*Couple cases of removing an item
    *1. Removing the root
    *2.	Removing a leaf
    *3. Removing something in the middle
    */

    //1
    if (rootPtr->getItem()==x)
    {
        BinaryNode* toDelete = rootPtr;
        rootPtr = rootPtr->getLeftChildPtr();
        BinaryNode* rightChild = rootPtr->getRightChildPtr();
        BinaryNode* leftChild = rootPtr->getLeftChildPtr();

        delete toDelete;
        while (leftChild->getrightChildPtr()!=nullptr)//keeps traversing down
        {
            leftChild = leftChild->getRightChildPtr();
        }   

        leftChild = leftChild->setRightChildPtr(rightChild);
    }
    else
    {    
    	BinaryNode* parent = search(x, rootPtr, rootPtr);


    	int dir;
    	if (parent->getrightChildPtr()==x)
    	{
    		BinaryNode* toDelete = parent->getrightChildPtr();
    		dir =0;
    	}
    	else
    	{
    		BinaryNode* toDelete = parent->getLeftChildPtr();
    		dir=1;
    	}

    	//Now we encounter our next two cases:
    	//2. if it's a leaf

    	if (toDelete->getrightChildPtr==nullptr && toDelete->getLeftChildPtr==nullptr)
    	{
    		delete toDelete;
    		if (dir==0)
    		{
    			parent->setRightChildPtr(nullptr);
    		}
    		else
    		{
    			parent->setLeftChildPtr(nullptr);
    		}
    	}


    	//3. Something in the middle

    	BinaryNode* leftChild = toDelete->getLeftChildPtr();
    	BinaryNode* rightChild = toDelete->getRightChildPtr();
    }

}