Chào mọi người ạ!
Em tên Lê Văn Hạnh, lớp KHTN2015.
Cho em hỏi cái code này của em sai ở đâu ạ?
Chương trình của em đơn giản chỉ là thêm 1 phần tử vào cây nhị phân tìm kiếm rồi sau đó in ra cây theo tứ tự NLR thôi ạ.
Chương trình của em bị lỗi cái thủ tục them(int x) của em. Em làm pascal thì được rồi ạ. Nhưng C++ không được. 
#include <stdio.h>
struct TREE{
int key;
struct TREE *left, *right;
};
void them(TREE *t, int x){
if (t!=NULL){
if (t->key<x) {
them(t->right, x);
return;
}
else{
them(t->left, x);
return;
}
}
t = new TREE;
t->key=x;
t->left=NULL;
t->right=NULL;
}
void NLR(TREE *t){
if (t!=NULL){
printf("%d ", t->key);
NLR(t->left);
NLR(t->right);
}
}
int main(){
int n;
TREE *Tree;
Tree = new TREE;
scanf("%d", &n);
for (int i=0; i<n; i++){
int x;
scanf("%d", &x);
them(Tree, x);
}
NLR(Tree);
}
Trong hàm main() bạn đã khởi tạo Tree = new TREE;
vậy khi gọi hàm them(Tree,x)
đoạn này sẽ được chạy:
if (t!=NULL){
if (t->key<x) {
them(t->right, x);
return;
}
else{
them(t->left, x);
return;
}
}
Mà cây con bên trái(t->left) lẫn cây con bên phải(t->right) đều chưa được khởi tạo nên bạn thêm giá trị vào sẽ lỗi thôi.
K10 năm nay giỏi nhỉ? mới năm nhất mà đã nghiên cứu đến đây rồi. Tương lai sẽ sáng sủa lắm đây, chúc bạn gặt hái được nhiều thành công nhé!
mình mà năm nhất đọc trúng bài này chắc tủi thân lắm 
int main(){
int n;
TREE *Tree;
Tree = new TREE; //chỗ này Tree xin cấp phát 1 ô nhớ, Tree->key=????, Tree->left=????, Tree->right=????
scanf("%d", &n);
for (int i=0; i<n; i++){
int x;
scanf("%d", &x);
them(Tree, x);
}
NLR(Tree);
}
void them(TREE *t, int x){
if (t!=NULL){
if (t->key<x) { //đến đây t->key = Tree->key ở trên là ????, không biết so sánh kiểu gì nên lỗi
them(t->right, x);
return;
}
else{
them(t->left, x); //ở đây nếu x=t->key nó cũng thêm x vào cây luôn, trong khi BST(binary search tree) không có phần tử trùng
return;
}
}
t = new TREE;
t->key=x;
t->left=NULL;
t->right=NULL;
}
Chắc bạn này code liên tục quá a ơi.