先序递归遍历输出时没有任何问题
中序非递归遍历时只输出了一个“?”
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSSIZE 100 //栈的最大空间
typedef struct BiNode
{
char data;
struct BiNode* Lchild, * Rchild;
}BiNode,*BiTree;
typedef struct
{
BiTree top;
BiTree base;
}SqStack;
void Initial_Stack(SqStack &s)
{
s.base = (BiTree)malloc(MAXSSIZE * sizeof(BiNode));
if (!s.base) printf("%s\n", strerror(errno));
else
{
s.top = s.base;
printf("Stack initialized\n");
}
}
int Stackempty(SqStack s)
{
if (s.top == s.base) return 1;
else return 0;
}
int Push(SqStack& s, BiNode tmp)
{
if (s.top - s.base >= MAXSSIZE) printf("Stack full\n");
else
{
*s.top = tmp;
s.top++;
return 1;
//printf("Elem pushed\n");
}
}
void Pop(SqStack& s, BiNode& q)
{
if (s.base == s.top) printf("Stack empty\n");
else
{
q = *s.top;
s.top--;
//printf("Elem poped\n");
}
}
int InOrderTraverse(BiTree T)//中序遍历非递归算法
{
SqStack s;
Initial_Stack(s);
BiTree tmp=T;
BiNode q;
while(tmp || !Stackempty(s))
{
if (tmp)
{
Push(s, *tmp);
tmp = tmp->Lchild;
}
else
{
Pop(s, q);
printf("%c ", q.data);
tmp = q.Rchild;
}
}
return 1;
}
void CreateBiTree(BiTree& T)
{
char weight;
//printf("Please input the weight\n");
scanf("%c", &weight);
if (weight == '#') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiNode));
T->data = weight;
//printf("OK\n");
CreateBiTree(T->Lchild);
CreateBiTree(T->Rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);//先序创建二叉树
InOrderTraverse(T);//中序遍历非递归算法
return 0;
}
问题在 void Pop(SqStack& s, BiNode& q) 出栈函数第 54 55行两行代码,将两行位置互换即可:
void Pop(SqStack& s, BiNode& q)
{
if (s.base == s.top)
printf("Stack empty\n");
else
{
s.top--; // s.top--; 在前 修改
q = *s.top; // 出栈在后 修改
//printf("Elem poped\n");
}
}
gpt
在给定的代码中,问题出现在 CreateBiTree 函数。它使用先序遍历的二叉树,但在输入节点数据时使用了 scanf,这会导致输入缓冲区残留一个换行符('\n')。
问题导致的现象是,在执行中序遍历时,程序会立即读取到这个换行符,并将其误认为是一个字符节点进行输出,因此输出了问号('?')。
要解决这个问题,可以在 CreateBiTree 函数的输入前使用 getchar() 来清空输入缓冲区的换行符,使得下一个字符能够正确输入。
修改后的代码如下所示:
void CreateBiTree(BiTree& T)
{
char weight;
getchar(); // 清空输入缓冲区的换行符
scanf("%", &weight);
if (weight == '#') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiNode));
T->data = weight;
CreateBiTree(T->Lchild);
CreateBiTree(T->Rchild);
}
}
这样,输入的字符节点就可以正确地构建二叉树,并且中序遍历不再输出问号。
从代码中看不出有输出问号的问题,可能是输入时出现了特殊字符导致输出异常。建议检查输入的二叉树数据是否正确,是否符合中序遍历的规则。另外,可以考虑在输出每个节点数据时,添加一些调试信息,以便更好地定位问题。例如,可以在输出节点数据时,同时输出节点的地址,以便确认是否正确访问了每个节点。
.
.