Exemple #1
0
/*Delete the successor node of middle-parent order traversal*/
AVLTree
DeleteSuccessor(AVLTree T){
	Position Tmp;
	if(T->Left == NULL) /*The subtree has only one node*/
		return T;
	else	/*Time to disable the miminal node*/
	if(T->Left->Left == NULL){
		Tmp = T->Left;
		T->Left = T->Left->Right;
		Tmp->Right = NULL;
		/*Handle the height*/
		T->Height = 1 + (MAX(Height(T->Left),Height(T->Right)));
		return Tmp;
	}
	else
		return DeleteSuccessor(T->Left);
}
Exemple #2
0
/* Delete Node */
ptr_t DeleteTreeNode(data_t *myHeap, data_t *Master2SysAlloc, int *fixedStack, int *secondStack, int stackPtr_avl, ptr_t rootPtr, int key){
	int flag_stop = 0;
	int flag_stackIsUsed = 0;
	ptr_t nowPtr = rootPtr;
	struct stack_t stackOutput;
	while(flag_stop == 0){
		struct sub_t subResult = DeleteNodeSub(myHeap, nowPtr, key);
		if(subResult.feedback == FB_DONE){
			flag_stop = 1;
			// --------- Deletion ---------
			ptr_t leftPtr = node_get_left_pointer(myHeap, nowPtr);
			ptr_t rightPtr = node_get_right_pointer(myHeap, nowPtr);
			if(leftPtr == NULL_PTR || rightPtr == NULL_PTR){ // at least one null children
				if(leftPtr != NULL_PTR){
					struct node_t_std nowNode = node_read_std(myHeap, leftPtr);
					node_write_std(myHeap, nowPtr, nowNode);
					node_delete(Master2SysAlloc, leftPtr);
				}else if(rightPtr != NULL_PTR){
					struct node_t_std nowNode = node_read_std(myHeap, rightPtr);
					node_write_std(myHeap, nowPtr, nowNode);
					node_delete(Master2SysAlloc, rightPtr);					
				}else{
					node_delete(Master2SysAlloc, nowPtr);
					nowPtr = NULL_PTR;
				}				
			}else{ // both leaves exists
				//1.get the inorder successor
				ptr_t rightPtr = node_get_right_pointer(myHeap, nowPtr);
				ptr_t minPtr = minValueNode(myHeap, rightPtr);

				//2.copy the inorder successor's data to this node
				int copyData = node_read_data(myHeap, minPtr);
				node_write_data(myHeap, nowPtr, copyData);				
				//3.delete the inorder successor
				ptr_t tempPtr = DeleteSuccessor(myHeap, Master2SysAlloc, secondStack, 0, rightPtr, copyData);
				node_set_right(myHeap, nowPtr, tempPtr);				
			}			
			// --------- Balancing ---------
			if(flag_stackIsUsed == 0){
				
				if(nowPtr == NULL_PTR){
					rootPtr = nowPtr;
				}else{
					rootPtr = ProcessNodeDeletion(myHeap,nowPtr);
				}
			}else{
				
				stackOutput = AVL_STACK_READ(fixedStack, stackPtr_avl);	
				stackPtr_avl = stackOutput.hdPtr_avl;		
				if(stackOutput.operation == GOING_LEFT){
					node_set_left(myHeap, stackOutput.pointer, nowPtr);
				}else{
					node_set_right(myHeap, stackOutput.pointer, nowPtr);
				}
				while(stackPtr_avl > 0){
					nowPtr = stackOutput.pointer;
					ptr_t nowPtr_new = ProcessNodeDeletion(myHeap, nowPtr);		
					stackOutput = AVL_STACK_READ(fixedStack, stackPtr_avl);
					stackPtr_avl = stackOutput.hdPtr_avl;				
					if(nowPtr_new != nowPtr){
						if(stackOutput.operation == GOING_LEFT){
							node_set_left(myHeap, stackOutput.pointer, nowPtr_new);
						}else{
							node_set_right(myHeap, stackOutput.pointer, nowPtr_new);
						}					
					}
				}			
				rootPtr = ProcessNodeDeletion(myHeap, stackOutput.pointer);					
			}			
		}else{
			flag_stackIsUsed = 1;
			if(subResult.feedback == FB_LEFT){
				stackOutput = AVL_STACK_WRITE(fixedStack, stackPtr_avl, nowPtr, GOING_LEFT);
				stackPtr_avl = stackOutput.hdPtr_avl;
				nowPtr = node_get_left_pointer(myHeap, nowPtr);
			}else{
				stackOutput = AVL_STACK_WRITE(fixedStack, stackPtr_avl, nowPtr, GOING_RIGHT);
				stackPtr_avl = stackOutput.hdPtr_avl;
				nowPtr = node_get_right_pointer(myHeap, nowPtr);
			}			
			if(nowPtr == NULL_PTR){
				flag_stop = 1;
			}			
		}		
	}
	return rootPtr;
}