user-0 提问: 二叉树实现问题

回复:
user: user-1
content: BiTree InorderLastNode(BiTree T) {   /*找二叉树中序遍历最后一个结点*/     datatype s;     if (T) {         InorderLastNode(T->lchild);         s = T->data;         InorderLastNode(T->rchild);     }     return s; }   这段程序也可以这样改   BiTree *InorderLastNode(BiTree T) {   /*找二叉树中序遍历最后一个结点*/     BiTree *Result =NULL;     if(T->lchild) {         Result = InorderLastNode(T->lchild);     } else if(T->rchild) {         Result = InorderLastNode(T->lchild);     } else {         Result = T;     }      return Result; }

user: user-0
content: 可是程序运行出来全是黑屏，打什么字都没反应

user: user-2
content: 可以这样改：   #include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct tnode { 	datatype data; 	struct tnode *lchild, *rchild; } BiTNode, *BiTree;  void visit(BiTree p);   /*输出p指针指向的结点*/ void Preorder(BiTree T);   /*前序遍历*/ void Inorder(BiTree T);   /*中序遍历*/ void Postorder(BiTree T);   /*后序遍历*/ BiTree  CreateTree();   /*以前序遍历的顺序建立二叉树*/ int deep(BiTree T);   /*求二叉树深度*/ int leaf(BiTree T);   /*求叶子结点数*/ int OneChild(BiTree T);   /*求1度结点数*/ int TwoChild(BiTree T);   /*求2度结点数*/ void Exchange(BiTree  T);   /*二叉树左右子树交换*/ datatype InorderLastNode(BiTree T);  /*找二叉树中序遍历最后一个结点*/  void visit(BiTree p) {       /*输出p指针指向的结点*/ 	if (p->data != ' ') { 		printf("%c ", p->data); 	} }  void Preorder(BiTree T) {    /*前序遍历*/ 	if (T != NULL) {    		visit(T);            //访问根节点 		Preorder(T->lchild); //访问左子节点 		Preorder(T->rchild); //访问右子节点 	} }  void Inorder(BiTree T) {     /*中序遍历*/ 	if (T != NULL) { 		Inorder(T->lchild);  //访问左子节点 		visit(T);            //访问根节点 		Inorder(T->rchild);  //访问右子节点 	} }  void Postorder(BiTree T) {   /*后序遍历*/ 	if (T != NULL) { 		Postorder(T->lchild); //访问左子节点 		Postorder(T->rchild); //访问右子节点 		visit(T);             //访问根节点 	} }  BiTree CreateTree() {          /*以前序遍历的顺序建立二叉树*/ 	char ch; 	BiTree T; 	if ((ch = getchar()) == ' ') { 		return NULL; 	} 	else { 		T = (BiTree)malloc(sizeof(BiTNode));   //生成根节点 		T->data = ch;           		T->lchild = CreateTree();   //构造左子树 		T->rchild = CreateTree();   //构造右子树 		return T; 	} }  int deep(BiTree T) {           /*求二叉树深度*/ 	if (T) { 		int leftdeep = deep(T->lchild); 		int rightdeep = deep(T->rchild); 		return leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1; 	} 	else { 		return 0; 	} }  int leaf(BiTree T) {           /*求叶子结点数*/ 	int m, n; 	if (!T) {   /*空树没有叶子*/ 		return 0; 	} 	else if(!T->lchild&&!T->rchild){   /*叶子结点*/ 		return 1; 	} 	else {   /*左子树的结点数加上右子树的结点数*/ 		m = leaf(T->lchild); 		n = leaf(T->rchild); 		return m + n; 	} }  int OneChild(BiTree T) {      /*求1度结点数*/ 	int n = 0; 	if (T == NULL) { 		return 0; 	} 	else if ((T->lchild == NULL&&T->rchild != NULL) || (T->lchild != NULL&&T->rchild == NULL)) { 		n = 1; 	} 	return OneChild(T->lchild) + OneChild(T->rchild) + n; }  int TwoChild(BiTree T) {      /*求2度结点数*/ 	int n = 0; 	if (T == NULL) { 		return 0; 	} 	else if ((T->lchild!=NULL&&T->rchild!=NULL)) 	{ 		n = 1; 	} 	return TwoChild(T->lchild) + TwoChild(T->rchild) + n; }  void Exchange(BiTree  T) {    /*二叉树左右子树交换*/ 	if (T) { 		BiTree temp = T->lchild; 		T->lchild = T->rchild; 		T->rchild = temp; 		Exchange(T->lchild); 		Exchange(T->rchild); 	} }  datatype InorderLastNode(BiTree T) {   /*找二叉树中序遍历最后一个结点*/ 	datatype s; 	if (T) { 		InorderLastNode(T->lchild); 		s = T->data; 		InorderLastNode(T->rchild); 	} 	return s; }  int main() { 	BiTree T; 	T = CreateTree(); 	printf("\n以前序遍历的二叉树:"); 	printf("\n先序遍历:"); 	Preorder(T); 	printf("\n"); 	printf("\n中序遍历:"); 	Inorder(T); 	printf("\n"); 	printf("\n后序遍历:"); 	Postorder(T); 	printf("\n"); 	printf("\n树的深度=%d\n", deep(T)); 	printf("1度结点数=%d\n", OneChild(T)); 	printf("2度结点数=%d\n", TwoChild(T)); 	Exchange(T); 	printf("\n"); 	InorderLastNode(T); 	return 0; }

user: user-2
content: 提示说的很明白啊，InorderLastNode函数中，你的s类型是datatype（也就是char），但你函数返回值需要的是BiTree类型