Sortowanie Drzewo BST

0

Witam mam problem z kodem do sortowania drzewem BST, coś mi w nim nie chce działać. Mam jeszcze jedno pytanie jak tam wstawić funkcję badającą czas działania algorytmu i zliczającą ilość porównań i zamian

#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

struct node
{
	int val;
	node*left,*right;
}

void add(node *root, int x)
{
	while(true)
	{
		if(x<root->val)
		{
			if(root->left==NULL)
				break;
			root=root->left;
		}
		else return;
	}
	
	node*new=new node;
	new->val=x;
	new->left;
	new->right=NULL;
	if(x<node->val)
		{
			node->left=new;
	else
		node->right=new;
	}
}

void show(node *root)
{
	if(root->left!=NULL)
		show(root->left);
	cout<<root->val<<" ";
	if(root->right!=NULL)
		show(root->right);
}

void del(node *root)
{
	if(root->left!=NULL)
		del(root->left);
	if(root->right!=NULL)
		del(root->right);
	delete root;
}

int main()
{
	srand(time(NULL));
	node*root=new node;
	int n=10

	root->val=2
	root->left=NULL;
	root->right=NULL;
	for(int i=0; i<n-1; i++)
	{
		add(root, rand()%20);
	}

	show(root);
	del(root);
	cout<<endl;
	system("pause");
	return 0;
}

 
0
fafafaf napisał(a):
void add(node *root, int x)
{
	while(true)
	{
		if(x<root->val)
		{
			if(root->left==NULL)
				break;
			root=root->left;
		}
		else return;
	}
	
	node*new=new node;
	new->val=x;
	new->left;
	new->right=NULL;
	if(x<node->val)
		{
			node->left=new;
	else
		node->right=new;
	}
}

zatrzymałem się na razie tutaj - dalej nie sprawdzałem. Źle dodajesz do tego drzewa.
Twój algorytm:

jeśli x jest mniejsze od root'a to coś tam wykonujesz, a jeśli większe lub równe (w podstawowym bst w zasadzie tylko większe) to opuść funkcję. Czyli jeśli podasz wartość większą od root'a - taką, która miałaby znaleźć się po prawej stronie opuszczasz funkcję bez dodania jej do drzewa. Chciałeś by tak to działało? Masz poza tym konflikt nazw, nie przeszukujesz drzewa w celu dodania wartości w odpowiednie miejsce (czyli najprościej brakuje wywołania rekurencyjnego). Ta funkcja jest źle napisana.

0

"jak tam wstawić funkcję badającą czas działania algorytmu i zliczającą ilość porównań i zamian"
Na ładnie, to byłoby stworzyć klasę, będącą int'em, a zliczającą operacje "na sobie".
Na brzydko, to:

static int s_porownania;
// s_porownania++; /*--> kiedy tylko porównujesz... w każdym miejscu w kodzie... obowiązkowo... */

Natomiast czas działania:

time_t czas = time(NULL);
// ....
time_t czas_dzialania = time(NULL) - czas;

W sekundach. Z dokładnością do milisekund biblioteka standardowa chyba nie posiada ( poprawcie mnie ), więc zostaje GetTickCount ( Windows 98+ ) lub lokalny odpowiednik.

0
node*new=new node;
        new->val=x;
        new->left;
        new->right=NULL;

WTF!? oO Nie wolno tworzyc zmiennych ktore maja nazwy slow kluczowych jezyka! Toz to sie nawet nie moze skompilowac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1