Untitled

mail@pastecode.io avatar
unknown
plain_text
23 days ago
3.9 kB
2
Indexable
Never
#include<iostream>
#include<string>

using namespace std;

struct node
{
	int data;            // Dữ liệu của node được lưu trữ
	struct node *pLeft;  // node liên kết trái (hay cây con trái)
	struct node *pRight; // node liên kết phải hay cây con phải
};
typedef struct node NODE; // đổi cú pháp struct node thành NODE để tiện sử dụng
typedef NODE *TREE;       // đổi NODE* thành TREE cho dễ sử dụng (bản chất vẫn trỏ về struct node)

// khởi tạo cây

void init(TREE &t)
{
	t = NULL; // cây rỗng
}

// hàm thêm phần tử x vào cây nhị phân
int sum_tree;
void add_tree(TREE &t, int x)
{
	// nếu cây rỗng
	if (t == NULL)
	{
		NODE *p = new NODE; // khởi tạo 1 node để thêm vào cây
		p->data = x;        // thêm dữ liệu x vào data
		p->pLeft = p->pRight = NULL;
		t = p; // node p là node gốc hay x là node gốc
		sum_tree++;
	}
	else // cây có tồn tại phần tử
	{
		if (t->data > x) // nếu phần tử thêm vào nhỏ hơn node gốc => thêm vào bên trái
		{
			add_tree(t->pLeft, x); // duyệt qua trái của phần tử t
		}
		else if (t->data < x) // nếu phần tử thêm vào lớn hơn node gốc => thêm vào bên phải
		{
			add_tree(t->pRight, x);
		}
	}
}

bool find_node(TREE &t, int x)
{
	if(t == NULL)
	{
		return 0;
	}
	else
	{
		if( t->data == x)
		{
			return 1;
		}
		else if( t->data < x)
		{
			find_node(t->pRight,x);
		}
		else
			find_node(t->pLeft,x);
	}
}

int remove_node(TREE &t, int x)
{
	if(t == NULL)
	{
		return 0;
	}
	else
	{
		if( t->data == x)
		{
			t = NULL;
			return 1;
		}
		else if( t->data < x)
		{
			remove_node(t->pRight,x);
		}
		else
			remove_node(t->pLeft,x);
	}
}

int upper_bound(TREE &t, int x)
{
	NODE *tmp = new NODE;
	tmp->data = -10000;
	while( t != NULL)
	{
		if( t->data < x )
		{
			tmp = t;
			t = t->pRight;
		}
		else
			t = t->pLeft;
	}
	return tmp->data == -10000 ? 0 : tmp->data;
}

int lower_bound(TREE &t, int x)
{
	NODE *tmp = new NODE;
	tmp->data = 10000;
	while( t != NULL)
	{
		if( t->data >= x )
		{
			tmp = t;
			t = t->pLeft;
		}
		else
			t = t->pRight;
	}
	return tmp->data == 10000 ? 0 : tmp->data;
}

int main(int argc, char** argv)
{
	int test_case;
	int T;
	/* 
	The freopen function below opens input.txt in read only mode and 
	sets your standard input to work with the opened file. 
	When you test your code with the sample data, you can use the function
	below to read in from the sample data file instead of the standard input.
	So. you can uncomment the following line for your local test. But you
	have to comment the following line when you submit for your scores.
	*/

	freopen("Text.txt", "r", stdin);
	cin>>T;

	/*
	Read each test case from standard input.
	*/
	for(test_case = 1; test_case <= T; ++test_case)
	{

		int n;
		cin >> n;
		TREE t;
		sum_tree = 0;
		init(t);
		cout << "#" << test_case << " ";
		for(int i = 0; i < n; i++)
		{
			string lenh;
			cin >> lenh;
			if(lenh != "size")
			{
				int x;
				cin >> x;
				if(lenh == "add")
				{
					add_tree(t,x);
				}
				else if(lenh == "remove")
				{
					remove_node(t,x);
				}
				else if(lenh == "contains")
				{
					bool found = find_node(t,x);
					cout << (found == 1 ? "true" : "false" ) << " ";
				}
				else if(lenh == "lower")
				{
					int tmp = upper_bound(t,x);
					tmp == 0 ? cout << "null " : cout << tmp << " ";
				}
				else
				{
					int tmp = lower_bound(t,x);
					tmp == 0 ? cout << "null " : cout << tmp << " ";
				}
			}
			else
			{
				cout << sum_tree << " ";
			}
		}
		cout << endl;
	}
	return 0;//Your program should return 0 on normal termination.
}
Leave a Comment