الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أسئلة في binary search tree

بدأه طــآلبة حآسب آلي . في 27 مايو 2011 · 7 رد · 2,259 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ,,

يآ ليت احد يصحح لي هالكود .. لأنه يطلع عندي خطأ بال inorder ,, postorder ,,,, preorder

يآ ليت بأسرع وقت عندي أختبار لاب فاينال ..

ولكم خالص دعواتي القلبية ..

#include <iostream>
#include <cstdlib>
using namespace std;

class BinarySearchTree
{
    private:
        struct tree_node
        {
           tree_node* left;
           tree_node* right;
           int data;
        };
        tree_node* root;

    public:
        BinarySearchTree()
        {
           root = NULL;
        }

        bool isEmpty() const { return root==NULL; }
        void print_inorder();
        void inorder(tree_node*);
        void print_preorder();
        void preorder(tree_node*);
        void print_postorder();
        void postorder(tree_node*);
        void insert(int);
        void remove(int);
};

// Smaller elements go left
// larger elements go right
void BinarySearchTree::insert(int d)
{
    tree_node* t = new tree_node;
    tree_node* parent;
    t->data = d;
    t->left = NULL;
    t->right = NULL;
    parent = NULL;

    // is this a new tree?
    if(isEmpty()) root = t;
    else
    {
        //Note: ALL insertions are as leaf nodes
        tree_node* curr;
        curr = root;
        // Find the Node's parent
        while(curr)
        {
            parent = curr;
            if(t->data > curr->data) curr = curr->right;
            else curr = curr->left;
        }

        if(t->data < parent->data)
           parent->left = t;
        else
           parent->right = t;
    }
}

void BinarySearchTree::remove(int d)
{
    //Locate the element
    bool found = false;
    if(isEmpty())
    {
        cout<<" This Tree is empty! "<<endl;
        return;
    }

    tree_node* curr;
    tree_node* parent;
    curr = root;

    while(curr != NULL)
    {
         if(curr->data == d)
         {
            found = true;
            break;
         }
         else
         {
             parent = curr;
             if(d>curr->data) curr = curr->right;
             else curr = curr->left;
         }
    }
    if(!found)
		 {
        cout<<" Data not found! "<<endl;
        return;
    }


		 // 3 cases :
    // 1. We're removing a leaf node
    // 2. We're removing a node with a single child
    // 3. we're removing a node with 2 children

    // Node with single child
    if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL
&& curr->right == NULL))
    {
       if(curr->left == NULL && curr->right != NULL)
       {
           if(parent->left == curr)
           {
             parent->left = curr->right;
             delete curr;
           }
           else
           {
             parent->right = curr->right;
             delete curr;
           }
       }
       else // left child present, no right child
       {
          if(parent->left == curr)
           {
             parent->left = curr->left;
             delete curr;
           }
           else
           {
             parent->right = curr->left;
             delete curr;
           }
       }
     return;
    }

		 //We're looking at a leaf node
		 if( curr->left == NULL && curr->right == NULL)
    {
        if(parent->left == curr) parent->left = NULL;
        else parent->right = NULL;
		 		 delete curr;
		 		 return;
    }


    //Node with 2 children
    // replace node with smallest value in right subtree
    if (curr->left != NULL && curr->right != NULL)
    {
        tree_node* chkr;
        chkr = curr->right;
        if((chkr->left == NULL) && (chkr->right == NULL))
        {
            curr = chkr;
            delete chkr;
            curr->right = NULL;
        }
        else // right child has children
        {
            //if the node's right child has a left child
            // Move all the way down left to locate smallest element

            if((curr->right)->left != NULL)
            {
                tree_node* lcurr;
                tree_node* lcurrp;
                lcurrp = curr->right;
                lcurr = (curr->right)->left;
                while(lcurr->left != NULL)
                {
                   lcurrp = lcurr;
                   lcurr = lcurr->left;
                }
		curr->data = lcurr->data;
                delete lcurr;
                lcurrp->left = NULL;
           }
           else
           {
               tree_node* tmp;
               tmp = curr->right;
               curr->data = tmp->data;
	       curr->right = tmp->right;
               delete tmp;
           }

        }
		 return;
    }

}

void BinarySearchTree::print_inorder()
{
  inorder(root);
}

void BinarySearchTree::inorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);
        cout<<" "<<p->data<<" ";
        if(p->right) inorder(p->right);
    }
    else return;
}

void BinarySearchTree::print_preorder()
{
    preorder(root);
}

void BinarySearchTree::preorder(tree_node* p)
{
    if(p != NULL)
    {
        cout<<" "<<p->data<<" ";
        if(p->left) preorder(p->left);
        if(p->right) preorder(p->right);
    }
    else return;
}

void BinarySearchTree::print_postorder()
{
    postorder(root);
}

void BinarySearchTree::postorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) postorder(p->left);
        if(p->right) postorder(p->right);
        cout<<" "<<p->data<<" ";
    }
    else return;
}

int main()
{
    BinarySearchTree b;
    int ch,tmp,tmp1;
    while(1)
    {
       cout<<endl<<endl;
       cout<<" Binary Search Tree Operations "<<endl;
       cout<<" ----------------------------- "<<endl;
       cout<<" 1. Insertion/Creation "<<endl;
       cout<<" 2. In-Order Traversal "<<endl;
       cout<<" 3. Pre-Order Traversal "<<endl;
       cout<<" 4. Post-Order Traversal "<<endl;
       cout<<" 5. Removal "<<endl;
       cout<<" 6. Exit "<<endl;
       cout<<" Enter your choice : ";
       cin>>ch;
       switch(ch)
       {
           case 1 : cout<<" Enter Number to be inserted : ";
                    cin>>tmp;
                    b.insert(tmp);
                    break;
           case 2 : cout<<endl;
                    cout<<" In-Order Traversal "<<endl;
                    cout<<" -------------------"<<endl;
                    b.print_inorder();
                    break;
           case 3 : cout<<endl;
                    cout<<" Pre-Order Traversal "<<endl;
                    cout<<" -------------------"<<endl;
                    b.print_preorder();
                    break;
           case 4 : cout<<endl;
                    cout<<" Post-Order Traversal "<<endl;
                    cout<<" --------------------"<<endl;
                    b.print_postorder();
                    break;
           case 5 : cout<<" Enter data to be deleted : ";
                    cin>>tmp1;
                    b.remove(tmp1);
                    break;
           case 6 : 
                    return 0;

       }
    }
}
#2
اقتباس
السلام عليكم ورحمة الله وبركاته ,,

و علیکم السلام و رحمة الله و برکاته.

لقد نویت أساعدک و نسخت اکوادک فی notepad، لکن کودک یحتوی علی 291 سطر و الوقت لا یسمحنی الآن قراءة کلهم (لدی أیضا اختبارات :) )

یا لیت کنت تحددین أین الخطأ بالضبط،

علی أی حال القی نظرة بهذا الموقع: algolist.net یوجد فیه کل الاکواد المطلوبة:

BST

>add

>remove

>search

>get values

آسف للتقصیر

أطیب تحیة.

1
#3

كودي لايوجد فيه syntax error

لكنه يعرض الجواب خطأ :(

بالفعل ساعدتني باضافتك .

شكرا لك لمساعدتك أخي الكريم ,,

موفق في اختبارك يآرب

تم تعديل هذه المشاركة بواسطة طــآلبة حآسب آلي . في 27 مايو 2011 في 11:28

#4

حسنا...

ما کان خطأ فی preorder , inorder, postorder کما ذکرتِ ،

یعمل بشکل صحیح..

لکن کما تعلمین، الشجرة تفرق ان ندخل الاعداد بترتیب مختلف، أظن انک تظنین هو بخطأ لهذا السبب.

ادخلی الاعداد بهذا الترتیب:

40 25 10 29 100

یعنی یصبح root=40 فسترین لا خطأ..

والناتج کالتالی و صحیح:

post-232933-014029300 1306493214_thumb.p

لکن کان خطأ صغیر فی insert : لیس صحیح ان یکون هناک duplicate. هذا بعد التصحیح ذلک:

#include <iostream>
#include <cstdlib>
using namespace std;

class BinarySearchTree
{
	private:
    	struct tree_node
    	{
   		tree_node* left;
   		tree_node* right;
   		int data;
    	};
    	tree_node* root;

	public:
    	BinarySearchTree()
    	{
   		root = NULL;
    	}

    	bool isEmpty() const { return root==NULL; }
    	void print_inorder();
    	void inorder(tree_node*);
    	void print_preorder();
    	void preorder(tree_node*);
    	void print_postorder();
    	void postorder(tree_node*);
    	void insert(int);
    	void remove(int);
};

// Smaller elements go left
// larger elements go right
void BinarySearchTree::insert(int d)
{
	tree_node* t = new tree_node;
	t->data = d;
	t->left = NULL;
	t->right = NULL;

	// is this a new tree?
	if(isEmpty())
		root = t;
	else
	{
    	//Note: ALL insertions are as leaf nodes
    	tree_node* curr;
		curr = root;

		tree_node* parent;
		parent=root;

    	// Find the Node's parent

		while(curr != NULL)
		{
			parent=curr;
			if(curr->data == t->data)
				return; // we had such a number
			else if(t->data > curr->data)
				curr = curr->right;
			else if (t->data < curr->data)
				curr=curr->left;
		}
		//Now we are in the correct node
		//Inserting..

		if (t->data < parent->data)
			parent->left = t;
		else
			parent->right= t;
	}
	cout<<"\nDone!";

}

void BinarySearchTree::remove(int d)
{
	//Locate the element
	bool found = false;
	if(isEmpty())
	{
    	cout<<" This Tree is empty! "<<endl;
    	return;
	}

	tree_node* curr;
	tree_node* parent;
	curr = root;

	while(curr != NULL)
	{
 		if(curr->data == d)
 		{
        	found = true;
        	break;
 		}
 		else
 		{
     		parent = curr;
     		if(d>curr->data) curr = curr->right;
     		else curr = curr->left;
 		}
	}
	if(!found)
         		{
    	cout<<" Data not found! "<<endl;
    	return;
	}


         		// 3 cases :
	// 1. We're removing a leaf node
	// 2. We're removing a node with a single child
	// 3. we're removing a node with 2 children

	// Node with single child
	if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL
&& curr->right == NULL))
	{
   	if(curr->left == NULL && curr->right != NULL)
   	{
   		if(parent->left == curr)
   		{
     		parent->left = curr->right;
     		delete curr;
   		}
   		else
   		{
     		parent->right = curr->right;
     		delete curr;
   		}
   	}
   	else // left child present, no right child
   	{
      	if(parent->left == curr)
   		{
     		parent->left = curr->left;
     		delete curr;
   		}
   		else
   		{
     		parent->right = curr->left;
     		delete curr;
   		}
   	}
 	return;
	}

         		//We're looking at a leaf node
         		if( curr->left == NULL && curr->right == NULL)
	{
    	if(parent->left == curr) parent->left = NULL;
    	else parent->right = NULL;
                         		delete curr;
                         		return;
	}


	//Node with 2 children
	// replace node with smallest value in right subtree
	if (curr->left != NULL && curr->right != NULL)
	{
    	tree_node* chkr;
    	chkr = curr->right;
    	if((chkr->left == NULL) && (chkr->right == NULL))
    	{
        	curr = chkr;
        	delete chkr;
        	curr->right = NULL;
    	}
    	else // right child has children
    	{
        	//if the node's right child has a left child
        	// Move all the way down left to locate smallest element

        	if((curr->right)->left != NULL)
        	{
            	tree_node* lcurr;
            	tree_node* lcurrp;
            	lcurrp = curr->right;
            	lcurr = (curr->right)->left;
            	while(lcurr->left != NULL)
            	{
           		lcurrp = lcurr;
           		lcurr = lcurr->left;
            	}
            	curr->data = lcurr->data;
            	delete lcurr;
            	lcurrp->left = NULL;
   		}
   		else
   		{
       		tree_node* tmp;
       		tmp = curr->right;
       		curr->data = tmp->data;
       		curr->right = tmp->right;
       		delete tmp;
   		}

    	}
         		return;
	}

}

void BinarySearchTree::print_inorder()
{
  inorder(root);
}

void BinarySearchTree::inorder(tree_node* p)
{
	if(p != NULL)
	{
    	inorder(p->left);
    	cout<<" "<<p->data<<" ";
    	inorder(p->right);
	}

}

void BinarySearchTree::print_preorder()
{
	preorder(root);
}

void BinarySearchTree::preorder(tree_node* p)
{
	if(p != NULL)
	{
    	cout<<" "<<p->data<<" ";
    	preorder(p->left);
    	preorder(p->right);
	}

}

void BinarySearchTree::print_postorder()
{
	postorder(root);
}

void BinarySearchTree::postorder(tree_node* p)
{
	if(p != NULL)
	{
    	postorder(p->left);
    	postorder(p->right);
    	cout<<" "<<p->data<<" ";
	}

}

int main()
{
	BinarySearchTree b;
	int ch,tmp,tmp1;
	while(1)
	{
   	cout<<endl<<endl;
   	cout<<" Binary Search Tree Operations "<<endl;
   	cout<<" ----------------------------- "<<endl;
   	cout<<" 1. Insertion/Creation "<<endl;
   	cout<<" 2. In-Order Traversal "<<endl;
   	cout<<" 3. Pre-Order Traversal "<<endl;
   	cout<<" 4. Post-Order Traversal "<<endl;
   	cout<<" 5. Removal "<<endl;
   	cout<<" 6. Exit "<<endl;
   	cout<<" Enter your choice : ";
   	cin>>ch;
   	switch(ch)
   	{
   		case 1 : cout<<" Enter Number to be inserted : ";
                	cin>>tmp;
                	b.insert(tmp);
                	break;
   		case 2 : cout<<endl;
                	cout<<" In-Order Traversal "<<endl;
                	cout<<" -------------------"<<endl;
                	b.print_inorder();
                	break;
   		case 3 : cout<<endl;
                	cout<<" Pre-Order Traversal "<<endl;
                	cout<<" -------------------"<<endl;
                	b.print_preorder();
                	break;
   		case 4 : cout<<endl;
                	cout<<" Post-Order Traversal "<<endl;
                	cout<<" --------------------"<<endl;
                	b.print_postorder();
                	break;
   		case 5 : cout<<" Enter data to be deleted : ";
                	cin>>tmp1;
                	b.remove(tmp1);
                	break;
   		case 6 : 
                	return 0;

   	}
	}
}

( ما نظرت بدالة remove، لا اعلم عن صحتها )..

أطیب تحیة.

المرفقات
result.png

تم تعديل هذه المشاركة بواسطة C77431 في 27 مايو 2011 في 13:47

1
#5

C77431

ششكرا كثيرا لك ..

أسأل الله بهذه الساعات ان ييسر أمرك ويوفقك في اختبارك ,,

بالفعل .. كنت شاكة بأن ترتيب الإدخال هو الخطأ ,, لأني اقارن بين كتابي وبين الناتج من كودي ,,

شكرا لك .

بارك الله فيك ,, أخجلتني , واعتذر لو قاطعت مذاكرتك .. : )

وفقك الله دنيآ وآخره

سأحاول أن افهم اكثر ,,

تم تعديل هذه المشاركة بواسطة طــآلبة حآسب آلي . في 27 مايو 2011 في 14:50

#6

طيب يآإخوان كيف اطلع depth ...

max element & min element .....

#7
طــآلبة حآسب آلي . كتب:

طيب يآإخوان كيف اطلع depth ...

max element & min element .....

للعمق: مع دالة recursive نحاسب أطول فرع ممکن، شیء کمثل هذا:

int depth( Node n )
 {
	if ( n->left != NULL && n->right != NULL ) 
		return ( max( depth( n->left), depth( n->right)) + 1 );
	else if (n->left != null) 
		return (depth( n->left) + 1);
	else if (n->right != null) 
		return (depth( n->right) + 1);
	else 
		return 1;
}

للعدد الاصغر و الاکبر:

فالعدد الاصغر هو فی أقصی یسار و العدد الاکبر هو فی اقصی یمین.. یعنی العنصر الاول و الآخر فی inorder

أطیب تحیة.

1
#8

#include <iostream.h>

#include <stdlib.h>

#include <process.h>

struct NODE

{

int info;

struct NODE *Left;

struct NODE *Right;

};

struct NODE *Root = NULL; // initially Root is NULL

class BST

{ public:

void AttachNode( struct NODE *pRoot, struct NODE *pNew )

{

if( Root == NULL ) // to attach first node with tree

{

Root = pNew; // attaches node on first root

}

else

{

if (pNew->info < pRoot->info )

{ // traverse to left sub-tree and find null at left

if( pRoot->Left != NULL)

AttachNode( pRoot->Left, pNew ); // recursive call

else

pRoot->Left = pNew; // attaches node on left

}

else

{ // traverse to right sub-tree and find null at right

if( pRoot->Right != NULL)

AttachNode( pRoot->Right, pNew ); // recursive call

else

pRoot->Right = pNew; // attaches node on left

}

}

}

void Insert(int x)

{

struct NODE *NewNode= new NODE;

NewNode->Left = NULL;

NewNode->Right= NULL;

NewNode->info = x;

AttachNode( Root, NewNode );

}

void Pre_Order(struct NODE *pRoot)

{

if (pRoot)

{

cout<<pRoot->info<<", ";

Pre_Order(pRoot->Left);

Pre_Order(pRoot->Right);

}

}

void Post_Order(struct NODE *pRoot)

{

if (pRoot)

{

Post_Order(pRoot->Left);

Post_Order(pRoot->Right);

cout<<pRoot->info<<", ";

}

}

void In_Order(struct NODE *pRoot)

{

if( pRoot )

{

if(pRoot->Left) In_Order(pRoot->Left);

cout<<pRoot->info<<", ";

if(pRoot->Right) In_Order(pRoot->Right);

}

}

void DisplayDescending(struct NODE *pRoot)

{

if( pRoot )

{

if(pRoot->Right) DisplayDescending(pRoot->Right);

cout<<pRoot->info<<", ";

if(pRoot->Left) DisplayDescending(pRoot->Left);

}

}

void DeleteTree( struct NODE *pRoot) // This function deletes all nodes in the tree

{

if( pRoot )

{

if(pRoot->Right) DeleteTree(pRoot->Right);

if(pRoot->Left) DeleteTree(pRoot->Left);

delete( pRoot );

}

}

}; // closing of class

int main( void )

{ BST obj; // object of class BST

int ch, item;

while( 1 )

{ cout<<"\n\n\n Binary Search Tree Functions\n\n";

cout<<"\n1. Insert a New Node";

cout<<"\n2. Remove Existing Node";

cout<<"\n3. In-Order Traverse (Ascending Order)";

cout<<"\n4. Pre-Order Traverse ";

cout<<"\n5. Post-Order Traverse ";

cout<<"\n6. Display in Descending Order (Reverse)";

cout<<"\n7. Exit";

cout<<"\nEnter you choice: ";

cin>>ch;

switch(ch)

{

case 1:

cout<<"\n\n put a number: "; cin>>item;

obj.Insert(item);

break;

case 2:

// Remove(); // This function is not defined.

break; // Students shall write this function as home work.

case 3:

cout<<"\n\n\n In-Order Traverse (ASCENDING ORDER)\n";

obj.In_Order(Root);

cout<<"\n\n";

break;

case 4:

cout<<"\n\n\n Pre-Order Traverse \n";

obj.Pre_Order(Root);

cout<<"\n\n";

break;

case 5:

cout<<"\n\n\n Post-Order Traverse \n";

obj.Post_Order(Root);

cout<<"\n\n";

break;

case 6:

cout<<"\n\n\nDESCENDING ORDER (Reverse )\n";

obj.DisplayDescending(Root);

cout<<"\n\n";

break;

case 7:

obj.DeleteTree(Root);

exit(0);

default:

cout<<"\n\nInvalid Input";

} // end of switch

} // end of while loop

return 0;

} // end of main( ) function

شباب عندي هذا الكود أريد إضافة إليه البحث عن عنصر ثم مسحة دالة remove

مواضيع مشابهة