user-0 提问: 数据结构——二叉排序树的创建查找插入，程序在创建树过程不运行，求帮忙看看代码哪里有问题！！

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #pragma warning( disable:4996)  typedef struct BSTNode { 	int data; 	BSTNode *lchild, *rchild; };    void InsertBST(BSTNode **T, int e) //插入  { 	bool x = false; 	if (!(*T)) 	{ 		*T = (BSTNode*)malloc(sizeof(BSTNode)); 		(*T)->data = e; 		(*T)->lchild = NULL; 		(*T)->rchild = NULL; 		x = true; 	} 	if ((*T)->data == e) 	{ 		if (x == true) 			printf("%d插入成功\n",e); 		else 			printf("插入值重复\n"); 	} 	else if ((*T)->data > e) 		InsertBST(&((*T)->lchild), e); 	 	else 		InsertBST(&((*T)->rchild), e);  }  BSTNode* CreatBST(BSTNode *T, int num[], int n) //创建  { 	T= (BSTNode*)malloc(sizeof(BSTNode)); 	T->data = num[0]; 	T->lchild = NULL; 	T->rchild = NULL; 	for (int i = 1; i < n; i++) 	{ 		InsertBST(&T, num[i]);  //创建过程即插入结点过程 	} 	return T; }  void SearchBST(BSTNode *T, int key) //递归查找  { 	BSTNode *p = T; 	if (p) 	{ 		if (key == p->data) 		{ 			printf("查找成功！\n"); 		} 		else if (key < p->data&&p->lchild) 			SearchBST(p->lchild, key); 		else if (key > p->data&&p->rchild) 			SearchBST(p->rchild, key); 		else printf("关键字不存在！\n"); 	} } int main() { 	BSTNode *T = NULL; 	int num[50], a=0, i = 0, j, key; 	printf("下面请按要求输入创建二叉排序树\n"); 	do { 		printf("请输入一个数字（-1退出循环）：\n"); 		scanf("%d", &num[i]); 		a = num[i]; 		i++; 	} while (a != (-1)); 	T = CreatBST(T, num, i-1);  	 	printf("请输入插入数字：\n"); //插入  	scanf("%d", &a); 	InsertBST(&T, a); 	 	 	printf("请输入查找关键数字：\n"); //查找  	scanf("%d", &key); 	SearchBST(T, key); 	return 0; }  做了一些改动，总体上没太大变化

user: user-0
content: 引用 1 楼 我当时害怕极了QAQ的回复:感觉你写的很奇怪，应该是指针的问题  具体代码没看，对指针做了一些改动  仅供参考  #include <stdio.h> #include <stdlib.h>  #pragma warning( disable:4996) #define OK 1 #define False -1 typedef struct BSTNode { 	int data; 	struct BSTNode *lchild, *rchild; };  int InsertBST(BSTNode *T, int e) //插入  { 	if (T == NULL) return False; 	BSTNode *p = NULL, *q = NULL; 	q = T; 	p = (BSTNode*)malloc(sizeof(BSTNode)); 	(p)->data = e; 	(p)->lchild = (p)->rchild = NULL; 	if (e == (q)->data) return 0; 	if (e < (q)->data) InsertBST(q->lchild, e); 	if (e > (q)->data) InsertBST(q->rchild, e); 	return OK; }  int CreatBST(BSTNode *T, int num[], int n) //创建  { 	int i = 1; 	(T) = (BSTNode*)malloc(sizeof(BSTNode)); 	(T)->data = num[i]; 	(T)->lchild = (T)->rchild = NULL; 	for (i = 2; i <= n; i++) 		InsertBST(T, num[i]);  //创建过程即插入结点过程  	return OK; }  int SearchBST(BSTNode *T, int key) //递归查找  { 	BSTNode *p = T; 	if (p) 	{ 		if (key == p->data) 		{ 			printf("查找成功！\n"); 			return OK; 		} 		else if (key < p->data&&p->lchild) 			SearchBST(p->lchild, key); 		else if (key > p->data&&p->rchild) 			SearchBST(p->rchild, key); 		else printf("关键字不存在！\n"); 	} } int main() { 	BSTNode T; 	int num[50], n = 0, a, i = 1, j, key; 	printf("下面请按要求输入创建二叉排序树\n"); 	do { 		printf("请输入一个数字（-1退出循环）：\n"); 		scanf("%d", &num[i]); 		a = num[i]; 		i++; 		n++; 	} while (a != (-1)); 	n--; 	if (CreatBST(&T, num, n)); printf("创建成功！\n"); //创建   	printf("请输入插入数字：\n"); //插入  	scanf("%d", &a); 	j = InsertBST(&T, a); 	if (j == 1) printf("\n插入成功！\n"); 	else if (j == 0) printf("数据已存在！无需插入！\n"); 	else printf("树空！插入失败！\n");  	printf("请输入查找关键数字：\n"); //查找  	scanf("%d", &key); 	SearchBST(&T, key);  } 我用的是二级指针，用了您改的指针，现在创建树成功了，但是查找关键字函数有点bug，存在的关键字查找不出来，你能再帮我看看代码吗？非常感谢！！

user: user-2
content: InsertBST的时候，p和q没有建立联系。 改成：    if (e < (q)->data) {           q->lchild=p;           InsertBST(p, e);    }     if (e > (q)->data) {        q->rchild=p;         InsertBST(p, e);    }

user: user-1
content: 感觉你写的很奇怪，应该是指针的问题  具体代码没看，对指针做了一些改动  仅供参考  #include <stdio.h> #include <stdlib.h>  #pragma warning( disable:4996) #define OK 1 #define False -1 typedef struct BSTNode { 	int data; 	struct BSTNode *lchild, *rchild; };  int InsertBST(BSTNode *T, int e) //插入  { 	if (T == NULL) return False; 	BSTNode *p = NULL, *q = NULL; 	q = T; 	p = (BSTNode*)malloc(sizeof(BSTNode)); 	(p)->data = e; 	(p)->lchild = (p)->rchild = NULL; 	if (e == (q)->data) return 0; 	if (e < (q)->data) InsertBST(q->lchild, e); 	if (e > (q)->data) InsertBST(q->rchild, e); 	return OK; }  int CreatBST(BSTNode *T, int num[], int n) //创建  { 	int i = 1; 	(T) = (BSTNode*)malloc(sizeof(BSTNode)); 	(T)->data = num[i]; 	(T)->lchild = (T)->rchild = NULL; 	for (i = 2; i <= n; i++) 		InsertBST(T, num[i]);  //创建过程即插入结点过程  	return OK; }  int SearchBST(BSTNode *T, int key) //递归查找  { 	BSTNode *p = T; 	if (p) 	{ 		if (key == p->data) 		{ 			printf("查找成功！\n"); 			return OK; 		} 		else if (key < p->data&&p->lchild) 			SearchBST(p->lchild, key); 		else if (key > p->data&&p->rchild) 			SearchBST(p->rchild, key); 		else printf("关键字不存在！\n"); 	} } int main() { 	BSTNode T; 	int num[50], n = 0, a, i = 1, j, key; 	printf("下面请按要求输入创建二叉排序树\n"); 	do { 		printf("请输入一个数字（-1退出循环）：\n"); 		scanf("%d", &num[i]); 		a = num[i]; 		i++; 		n++; 	} while (a != (-1)); 	n--; 	if (CreatBST(&T, num, n)); printf("创建成功！\n"); //创建   	printf("请输入插入数字：\n"); //插入  	scanf("%d", &a); 	j = InsertBST(&T, a); 	if (j == 1) printf("\n插入成功！\n"); 	else if (j == 0) printf("数据已存在！无需插入！\n"); 	else printf("树空！插入失败！\n");  	printf("请输入查找关键数字：\n"); //查找  	scanf("%d", &key); 	SearchBST(&T, key);  }