int FunctionTree::calculateNodeCount(Function* parent){
	if(parent != NULL) return 1+calculateNodeCount(parent->l)+calculateNodeCount(parent->r);
	else return 0;
}
int FunctionTree::size(){
	checkTree();
	return calculateNodeCount(rootNode);
}
Beispiel #3
0
/* Rotate the tree nodea from left to right. */
void rotateNodeBelowRight(BBSTNode nodea, BBSTNode *nodeptr)
{
	
	BBSTNode aparent = NULL;
	BBSTNode nodeb = NULL;
	BBSTNode nodec = NULL;
	int leftbfactor = 0;
    
	Assert( nodea != NULL );
	Assert( nodeptr != NULL );
	Assert( nodea->Left != NULL );
    
	
	leftbfactor = getBalanceFactor(nodea->Left);
	aparent = nodea->Parent;
	nodeb = nodea->Left;
    
	/****** case 1 ******
	 *    A          C
	 *   / a        / \
	 *  B     ---> B   A
 	 * b \        b c d a
	 *    C
	 *   c d
	 ********************/
	if ( leftbfactor < 0 ) {
		/* Reorganize tree structure among A, B, C */
		nodec = nodeb->Right;
		connectAsLeftChild(nodea,nodec->Right);
		connectAsRightChild(nodeb,nodec->Left);
		connectAsLeftChild(nodec,nodeb);
		connectAsRightChild(nodec,nodea);
		/* Handle the parent node of tree A, B, C */
		*nodeptr = nodec;
		nodec->Parent = aparent;
		/* Handle children count number */
		calculateNodeCount(nodeb);
		calculateNodeCount(nodea);
		calculateNodeCount(nodec);
		/* Handle children depth number */
		calculateNodeDepth(nodeb);
		calculateNodeDepth(nodea);
		calculateNodeDepth(nodec);
	}
    
	/****** case 2 ******
     *      A        B
     *     / a      / \
     *    B   ---> C   A
     *   / b      c d b a
     *  C
	 * c d
     ********************/
	else {
        /* Reorganize tree structure among A, B, C */
        nodec = nodeb->Left;
		connectAsLeftChild(nodea,nodeb->Right);
        connectAsRightChild(nodeb,nodea);
        /* Handle the parent node of tree A, B, C */
        *nodeptr = nodeb;
        nodeb->Parent = aparent;
        /* Handle children count number */
        calculateNodeCount(nodea);
        calculateNodeCount(nodeb);
        /* Handle children depth number */
        calculateNodeDepth(nodea);
        calculateNodeDepth(nodeb);
	}
	
}