typedef int TreeEle; // 树节点的数据域的类型
typedef struct TreeNode *PtrTNode;
typedef PtrTNode StackEle; // 栈的节点的数据域的类型
typedef struct StackNode *PtrSNode;
typedef struct TreeNode
{
TreeEle ele;
PtrTNode left;
PtrTNode right;
}TreeNode;
typedef struct StackNode
{
StackEle ele;
PtrSNode next;
}StackNode;
PtrTNode CreateBinTree(); // 创建空二叉树
bool IsTreeEmpty(PtrTNode Root); // 判断树是否空
PtrTNode InsertTree(PtrTNode Root, TreeEle data); // 向二叉搜索树里添加一个数据(先递归查找,再添加)
PtrTNode DeleteTree(PtrTNode Root, TreeEle data); // 从二叉搜索树中删除一个数据(也是先递归查找)
void InOrderTraversal(PtrTNode Root); // 中序遍历
void PreOrderTraversal_stack(PtrTNode Root); // 不使用递归的中序遍历(该函数有问题)
PtrSNode CreateStack(); // 创建空栈
bool IsStackEmpty(PtrSNode top); // 判断栈是否为空
void Push(PtrSNode top, StackEle data); // 入栈
StackEle Pop(PtrSNode top); // 出栈
//-------------Tree-----------------
PtrTNode CreateBinTree()
{
PtrTNode R = (PtrTNode)malloc(sizeof(TreeNode));
if (NULL != R)
{
R->ele = 100;
R->left = R->right = NULL;
}
return R;
}
PtrTNode InsertTree(PtrTNode Root, TreeEle data)
{
if (NULL == Root) // 若原树为空,生成并返回一个节点的二叉搜索树
{
Root = (PtrTNode)malloc(sizeof(TreeNode));
Root->ele = data;
Root->left = Root->right = NULL;
}
else if (data < Root->ele)
{
Root->left = InsertTree(Root->left, data); // 递归插入左子树
}
else if (data > Root->ele)
{
Root->right = InsertTree(Root->right, data); // 递归插入右子树
}
return Root;
}
void InOrderTraversal(PtrTNode Root)
{
if (NULL != Root)
{
PreOrderTraversal(Root->left);
printf("%d ", Root->ele);
PreOrderTraversal(Root->right);
}
}
// 有问题,估计是栈的问题,不是树的问题
void PreOrderTraversal_stack(PtrTNode Root)
{
PtrSNode S = CreateStack();
PtrTNode T = Root;
while ((NULL != T) || (false == IsStackEmpty(S))) // 只要栈里还有结点未被弹出,就循环
{
while (NULL != T) // 一路向左,并将沿途节点压入栈中
{
Push(S, T->left);
T = T->left;
}
if (false == IsStackEmpty(S))
{
T = Pop(S);
printf("%d ", T->ele);
T = T->right;
}
}
}
bool IsTreeEmpty(PtrTNode Root)
{
return ((NULL == Root->left) && (NULL == Root->right));
}
//------------------------------------------
//---------------Stack-----------------------
PtrSNode CreateStack()
{
PtrSNode S;
S = (PtrSNode)malloc(sizeof(StackNode));
return S;
}
bool IsStackEmpty(PtrSNode top)
{
return (NULL == top->next);
}
void Push(PtrSNode top, StackEle data)
{
PtrSNode S = (PtrSNode)malloc(sizeof(StackNode));
S->ele = data;
S->next = top->next;
top->next = S;
}
StackEle Pop(PtrSNode top)
{
if ((NULL == top) || (NULL == top->next))
{
printf("error!\n");
return NULL;
}
StackEle data = top->next->ele;
PtrSNode S = top->next;
top->next = top->next->next;
// free(S);
return data;
}
//---------------------------------
int main()
{
PtrTNode Root = CreateBinTree();
Root = InsertTree(Root, 25);
Root = InsertTree(Root, 40);
Root = InsertTree(Root, 112);
Root = InsertTree(Root, 312);
Root = InsertTree(Root, 12);
Root = InsertTree(Root, 172);
InOrderTraversal(Root); // 使用递归的中序遍历没有问题
printf("\n");
PreOrderTraversal_stack(Root); // 使用非递归的中序遍历有问题
printf("\n");
return 0;
}
输出为:
25 12 40 100 112 312 172
Segmentation fault: 11
应该不是遍历函数的问题(),遍历函数的逻辑是没有错的
个人认为是栈的写法有问题,网上搜索说该错误是由于使用了野指针或空指针,但是我看了几遍也没有看出问题,特来求助广大网友,望解答