user-0 提问: 中序遍历最后一个结点什么都没有，怎么修改呢？

回复:
user: user-0
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);   /*二叉树左右子树交换*/ BiTree 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) {           /*求二叉树深度*/ 	int lh, rh; 	if (T == NULL) { 		return 0; 	} 	else { 		lh = deep(T->lchild); 		rh = deep(T->rchild); 	} 	return (lh > rh ? lh : rh) + 1; }  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) {    /*二叉树左右子树交换*/ 	BiTree temp; 	if (T) { 		temp = T->lchild; 		T->lchild = T->rchild; 		T->rchild = temp; 		Exchange(T->lchild); 		Exchange(T->rchild); 	} }  BiTree InorderLastNode(BiTree T) {   /*找二叉树中序遍历最后一个结点*/ 	if (T) { 		while (T->rchild) { 			T = T->rchild; 		} 	} 	return T; }  int main() { 	BiTree T; 	printf("以前序遍历的二叉树:"); 	T = CreateTree(); 	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)); 	printf("\n二叉树中序遍历最后一个结点为:%c", InorderLastNode(T)->data); 	printf("\n"); 	printf("\n交换后的二叉树先序遍历为:"); 	Exchange(T); Preorder(T); 	printf("\n"); 	printf("\n交换后的二叉树中序遍历为:"); 	Inorder(T); 	printf("\n"); 	printf("\n交换后的二叉树后序遍历为:"); 	Postorder(T); 	printf("\n"); 	return 0; } 我已经完成

user: user-1
content: 引用 3 楼 user-2 的回复:printf("\n二叉树中序遍历最后一个结点为:%c", InorderLastNode(T));  这条语句中：%c需要的是char类型的，这里类型不符合 printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: printf("\n二叉树中序遍历最后一个结点为:%c", InorderLastNode(T));  这条语句中：%c需要的是char类型的，这里类型不符合

user: user-0
content: 我问的是中序遍历最后一个结点用什么函数得出？为什么我是空的？

user: user-1
content: 仅供参考：#include <iostream> #include <stack> #include <queue> #include <locale.h> using namespace std; typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int CreateBiTree(BiTree &T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         T = NULL;     } else {         T = (BiTree)malloc(sizeof(BiTNode));         T->data = data;         //生成根结点         CreateBiTree(T->lchild);//构造左子树         CreateBiTree(T->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->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);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈             stack.pop();             p = p->rchild;          //访问右子树         }     } } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈，访问根节点             printf("%c ",p->data);             stack.pop();             p = p->rchild;          //访问右子树         }     } }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     stack<BiTreePost> stack;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack.push(BT);             p = p->lchild;         }         while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点             BT = stack.top();             stack.pop();//退栈             printf("%c ",BT->biTree->data);         }         if (!stack.empty()) {//遍历右子树             BT = stack.top();             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     } }  void LevelOrder(BiTree T) {//层次遍历     if (T == NULL) return;     BiTree p = T;     queue<BiTree> queue;//队列     queue.push(p);//根节点入队     while (!queue.empty()) {    //队列不空循环         p = queue.front();      //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         queue.pop();            //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue.push(p->lchild);         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue.push(p->rchild);         }     } } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G