SunQuest
           C Programming
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me
Go Back   Dev Shed ForumsProgramming LanguagesC Programming

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
Stay one step ahead of the competition. Evaluate and give feedback on some of the hottest web development tools on the market today. Make your opinion heard! Click Here
  #1  
Old May 4th, 2008, 06:39 AM
esraa el sayed esraa el sayed is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: May 2008
Posts: 4 esraa el sayed User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 36 m 29 sec
Reputation Power: 0
Binary tree

How to Delete a node from a binary tree (the node have data , right pointer and left pointer )

Reply With Quote
  #2  
Old May 4th, 2008, 09:32 PM
Scorpions4ever's Avatar
Scorpions4ever Scorpions4ever is offline
Banned ;)
Dev Shed God 5th Plane (7000 - 7499 posts)
 
Join Date: Nov 2001
Location: Glendale, Los Angeles County, California, USA
Posts: 7,430 Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level)Scorpions4ever User rank is Major General (70000 - 90000 Reputation Level) 
Time spent in forums: 4 Weeks 1 Day 21 h 41 m 55 sec
Reputation Power: 784
There are a few cases to consider here. Here're some of them.

1. Node to be deleted has no children
Simply delete the node

2. The node has one child (either a left or a right child)
Point the parent of this node to the child and then delete the node. Say we want to delete node 3 from the figure below.
Code:
Before delete
===========
        4
       / \
      3   6
     /   / \
    2   5   7
   /
  1

In this case, we simply point 4 to 2 and then delete node 3
Code:
After delete
===========
        4
       / \
      2   6
     /   / \
    1   5   7


3. Node has two children. Replace the node by its inorder successor. Say we want to delete 3 in the figure below:
Code:
Before Delete
==========
        6
       / \
      3   7
     / \   \
    2   5   8
   /   /
  1   4

The in-order successor of node 3 is 4. Hence we grab that node and replace it as shown below:
Code:
After Delete
==========
        6
       / \
      4   7
     / \   \
    2   5   8
   /  
  1   
__________________
Up the Irons
What Would Jimi Do? Smash amps. Burn guitar. Take the groupies home.
"Death Before Dishonour, my Friends!!" - Bruce D ickinson, Iron Maiden Aug 20, 2005 @ OzzFest
Down with Sharon Osbourne

Puzzle of the Month solved by sizeablegrin, etienne141 and L7Sqr, superior C/C++ programmers of the month

Reply With Quote
  #3  
Old May 5th, 2008, 05:24 AM
Peter_APIIT Peter_APIIT is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Apr 2007
Posts: 22 Peter_APIIT Negative: is most likely a SPAMMER and a traitor to the cause. 
Time spent in forums: 40 m 10 sec
Reputation Power: 0
This is an example i did before :

Code:

struct BST* BST_Remove(struct BST *BST,int *removeptr)
{
	// Parent of RemoveNode
	struct Tree_Node *parent;      
	// Parent of traversal 
	struct Tree_Node *parent_traversal; 
	struct Tree_Node *tempTraversal;
	struct Tree_Node *traversal;    
	struct Tree_Node *RemoveNode;  
	// To maintain children of RemoveNode
	struct Tree_Node *tempRemoveNode;  

	char special = 'y';

	parent = BST->root;
	traversal = BST->root;
	tempTraversal = BST->root;
	parent_traversal = BST->root;

	/*
		if no child, just delete
		if one child, point by grandparent
		
		if two children, 
		swap with it with 
		inorder-successor(Left child of right sub Tree)	
		// Smallest in right sub tree
		Traverse once to right , then continue
		traverse to left  
		
		or
		inorder-predecessor(Right child of Left sub Tree)
		// Largest in left sub tree
	*/
	
	// Iteractve Remove Tree Node
	while(traversal != NULL)
	{
		// To remove root node
		if (*removeptr == tempTraversal->value)
		{
			RemoveNode = BST->root;
			tempRemoveNode = BST->root;
			
			// got 2 children
			if (RemoveNode->leftNode != NULL
						&& RemoveNode->rightNode != NULL)
			{
				// Traverse once to right tree 
				if (tempTraversal->rightNode != NULL)
				{
					tempTraversal = tempTraversal->rightNode;
				}

				// Continue traverse smallest unit left sub tree
				while(tempTraversal->leftNode != NULL)
				{
					tempTraversal = tempTraversal->leftNode;
				}
				tempRemoveNode->leftNode = RemoveNode->leftNode;
				tempRemoveNode->rightNode = RemoveNode->rightNode;

				tempTraversal->leftNode = tempRemoveNode->leftNode;
				tempTraversal->rightNode = tempRemoveNode->rightNode;

				if (traversal != NULL)
				{
					traversal = traversal->rightNode;
				}

				traversal->leftNode = NULL;
				Tree_Node_Deallocate(RemoveNode);

				BST->root = tempTraversal;

				while(traversal != NULL)
				{
					traversal = traversal->leftNode;
				}
			}		
		}
		else if (traversal != NULL)
		{
			if (*removeptr < traversal->value)
			{
				traversal = traversal->leftNode;
				parent_traversal = parent_traversal->leftNode;

				if (traversal != NULL)
				{
					RemoveNode = traversal;
					tempRemoveNode = traversal;
				}

				if (traversal != NULL)
				{
					if (traversal->value == *removeptr)
					{
						// got 2 children
						if (RemoveNode->leftNode != NULL
							&& RemoveNode->rightNode != NULL)
						{
							// Traverse once to right tree 
							if (traversal->rightNode != NULL)
							{
								traversal = traversal->rightNode;
								parent_traversal = parent_traversal->rightNode;
							}

							// Continue traverse smallest unit left sub tree
							while(traversal->leftNode != NULL)
							{
								traversal = traversal->leftNode;
							}

							// To identify parent of traversal
							if (parent_traversal->leftNode != NULL)
							{
								while(parent_traversal->leftNode->leftNode != NULL)
								{	
									parent_traversal = parent_traversal->leftNode;
								}
								special = 'n';
							}

							if (special == 'n')
							{
								tempRemoveNode->rightNode = RemoveNode->rightNode;
								tempRemoveNode->leftNode = RemoveNode->leftNode;
							}
							
							if (traversal->value 
								<parent->value)
							{
								parent->leftNode = traversal;
							}
							else
							{
								parent->rightNode = traversal;
							}

							if (special == 'n')
							{
								traversal->leftNode = tempRemoveNode->leftNode;
								traversal->rightNode = tempRemoveNode->rightNode;

								if (RemoveNode->value 
									< parent_traversal->value)
								{
									parent_traversal->leftNode = RemoveNode;
								}
								else
								{
									parent_traversal->rightNode = RemoveNode;
								}
							}
							else
							{
								traversal->leftNode = tempRemoveNode->leftNode;
							}
							Tree_Node_Deallocate(RemoveNode);
						}
						// Got 1 child
						else if (RemoveNode->leftNode != NULL
							|| RemoveNode->rightNode != NULL)
						{
							// Swap it with its Left child 
							if (RemoveNode->leftNode != NULL)
							{
								traversal = traversal->leftNode;
								
								if (traversal->value < parent->value)
								{
									parent->leftNode = traversal;
								}
								else
								{
									parent->rightNode = traversal;
								}
								Tree_Node_Deallocate(RemoveNode);
							}

							// Swap it with its Right child 
							if (RemoveNode->rightNode != NULL)
							{
								traversal = traversal->rightNode;

								if (traversal->value < parent->value)
								{
									parent->leftNode = traversal;
								}
								else
								{
									parent->rightNode = traversal;
								}
								Tree_Node_Deallocate(RemoveNode);
							}
						}
						// No child
						else
						{
							Tree_Node_Deallocate(RemoveNode);
							parent->leftNode = NULL;
						}
					}
				}
				if (parent != NULL)
				{
					parent = parent->leftNode;
				}	
			}
			else
			{
				traversal = traversal->rightNode;
				parent_traversal = parent_traversal->rightNode;
				
				if (traversal != NULL)
				{
					RemoveNode = traversal;
					tempRemoveNode = traversal;
				}

				if (traversal != NULL)
				{
					if (traversal->value == *removeptr)
					{
						// got 2 children
						if (RemoveNode->leftNode != NULL
							&& RemoveNode->rightNode != NULL)
						{
							// Traverse once to right tree 
							if (traversal->rightNode != NULL)
							{
								traversal = traversal->rightNode;
								parent_traversal = parent_traversal->rightNode;
							}

							// Continue traverse smallest unit left sub tree
							while(traversal->leftNode != NULL)
							{
								traversal = traversal->leftNode;
							}

							parent_traversal = parent_traversal;
							// To identify parent of traversal
							if (parent_traversal->leftNode != NULL)
							{
								while(parent_traversal->leftNode->leftNode != NULL)
								{
									parent_traversal = parent_traversal->leftNode;
								}
								special = 'n';
							}

							tempRemoveNode->leftNode = RemoveNode->leftNode;
							tempRemoveNode->rightNode = RemoveNode->rightNode;
							
							if (traversal->value 
								<parent->value)
							{
								parent->leftNode = traversal;
							}
							else
							{
								parent->rightNode = traversal;
							}
							
							if (special == 'n')
							{
								traversal->leftNode = tempRemoveNode->leftNode;
								traversal->rightNode = tempRemoveNode->rightNode;
						
								if (RemoveNode->value 
									< parent_traversal->value)
								{
									parent_traversal->leftNode = RemoveNode;
								}
								else
								{
									parent_traversal->rightNode = RemoveNode;
								}
							}
							else
							{
								traversal->leftNode = tempRemoveNode->leftNode;
							}
							Tree_Node_Deallocate(RemoveNode);
						}
						// Got 1 child
						else if (RemoveNode->leftNode != NULL
							|| RemoveNode->rightNode != NULL)
						{
							// Swap it with its Left child 
							if (RemoveNode->leftNode != NULL)
							{
								traversal = traversal->leftNode;
								
								if (traversal->value < parent->value)
								{
									parent->leftNode = traversal;
								}
								else
								{
									parent->rightNode = traversal;
								}
								Tree_Node_Deallocate(RemoveNode);
							}

							// Swap it with its Right child 
							if (RemoveNode->rightNode != NULL)
							{
								traversal = traversal->rightNode;

								if (traversal->value < parent->value)
								{
									parent->leftNode = traversal;
								}
								else
								{
									parent->rightNode = traversal;
								}
								Tree_Node_Deallocate(RemoveNode);
							}
						}
						// No child
						else
						{
							Tree_Node_Deallocate(RemoveNode);
							parent->rightNode = NULL;
						}
					}
				}
				if (parent != NULL)
				{
					parent = parent->rightNode;
				}
			}	
		}
	}
	
	return BST;
}


I hope this help.

Reply With Quote
  #4  
Old May 5th, 2008, 09:52 AM
esraa el sayed esraa el sayed is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: May 2008
Posts: 4 esraa el sayed User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 36 m 29 sec
Reputation Power: 0
Really thanks

Really Thanks................................

Reply With Quote
  #5  
Old May 5th, 2008, 09:53 AM
esraa el sayed esraa el sayed is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: May 2008
Posts: 4 esraa el sayed User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 36 m 29 sec
Reputation Power: 0
tHANKS ALOT

Reply With Quote
Reply

Viewing: Dev Shed ForumsProgramming LanguagesC Programming > Binary tree


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump


Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 





© 2003-2008 by Developer Shed. All rights reserved. DS Cluster 2 hosted by Hostway