启动调试直接显示segmentation fault了,是这个递归写的不对吗
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef char ElementType;
typedef struct Node *Position;
typedef struct Node *Tree;
Tree Initialize();
void InsertLeft(Position N,ElementType value);
void InsertRight(Position N,ElementType value);
bool IsLeaf(Position N);
void SetValue(Position N,ElementType value);
void MiddleScan(Position N);
struct Node
{
ElementType value;
Position LeftChild;
Position RightChild;
};
```c
#include "BinaryTree.h"
Tree Initialize()
{
Tree T = (Tree)malloc(sizeof(struct Node));
T->LeftChild = NULL;
T->RightChild = NULL;
T->value = ' ';
return T;
}
void InsertLeft(Position N,ElementType value)
{
Position New;
if (N->LeftChild)
N->value = value;
else
New = malloc(sizeof(struct Node));
New->RightChild = New->LeftChild =NULL;
New->value = value;
N->LeftChild = New;
}
void InsertRight(Position N,ElementType value)
{
Position New;
if (N->RightChild)
N->value = value;
else
New = malloc(sizeof(struct Node));
New->RightChild = New->LeftChild =NULL;
New->value = value;
N->RightChild = New;
}
bool IsLeaf(Position N)
{
return (N->LeftChild || N->RightChild);
}
void SetValue(Position N,ElementType value)
{
N->value = value;
}
void MiddleScan(Tree N)
{
if (N->LeftChild == NULL && N->RightChild == NULL)
printf("%c",N->value);
else
MiddleScan(N->LeftChild);
printf("%c",N->value);
MiddleScan(N->RightChild);
}
int main()
{
Tree T0 = Initialize();
SetValue(T0,'a');
InsertLeft(T0,'b');
InsertRight(T0,'c');
MiddleScan(T0);
system("pause");
return 0;
}

兄弟,我看了你的代码,你看你的中序遍历函数:
void MiddleScan(Tree N)
{
if (N->LeftChild == NULL && N->RightChild == NULL)
printf("%c",N->value);
else
MiddleScan(N->LeftChild);
printf("%c",N->value);
MiddleScan(N->RightChild);
}
可以看懂你的本意是好的,估计是像判断这个节点是不是根节点,如果是根节点那么他的左右孩子应该都没有,然后打印这个节点的值,这当然没有什么问题,但是问题是进入这个函数的结点你有没有为他分配空间呢?,如果没有给他分配空间,那为什么他会有左孩子和右孩子呢?对不?然后你的主函数里输入了一个左孩子和一个右孩子,然后当第一次执行这个函数的时候,根节点进来然后他的左右孩子不为空,接下来就是把他的左孩子作为实参递归一遍,进来之后,判断他的左右子树都空,所以打印这个值 b,然后最让人头疼的来了,你这else后面妹打括号啊!!!!!妹打括号啊!!!!让我想半天[捂脸],然后你看,他又打了一遍 b,然后他又要执行一下把这个 b 节点的右孩子递归一下,那这个时候这个右孩子是NULL对不,那怎么递归嘞,所以,你的逻辑毫无问题,但是败给了这个书写习惯,哈哈哈,希望你以后要注意
结果你看一下,上一个兄弟说的方法也很好,我替你跑了一下
当然我看你是用一级指针建立的树,今天我看了一下用二级指针建立的数,欢迎你来跟我探讨!
void MiddleScan(Tree N)
{
if (N!= NULL){
MiddleScan(N->LeftChild);
printf("%c",N->value);
MiddleScan(N->RightChild);
}
}