Untitled
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