c-先序建的树,中序遍历,为啥在Push处会中断运行啊

问题描述

先序建的树,中序遍历,为啥在Push处会中断运行啊

#include 
#include 
#include

#define S_SIZE    100
#define STACKINCREMENT  10

typedef struct BiTNode
{
    char     data;
    struct BiTNode   *lchild, *rchild;
}BiTNode,*BiTree;
typedef BiTNode ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stacksize;
}SqStack;

BiTree CreateBiTree(BiTree T)
{
    char ch;
    scanf_s("%c",&ch);
    if (ch == ' ')
      T = NULL;
    else
    {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        T->lchild=CreateBiTree(T->lchild);
        T->rchild=CreateBiTree(T->rchild);
    }
    return T;
}

void InitStack(SqStack *L)
{
    L->base = (ElemType *)malloc(sizeof(S_SIZE * sizeof(char)));
            L->top = L->base;
            L->stacksize = S_SIZE;
    }

void Push(SqStack *L, ElemType *e)
{
if (L->top - L->base >= L->stacksize)
{//栈满,追加存储空间
L->base = (ElemType *)realloc(L->base, (L->stacksize + STACKINCREMENT)*sizeof(ElemType));
L->top = L->base + L->stacksize;
L->stacksize += STACKINCREMENT;
}
*L->top++= *e;

运行到这会中断

}

void Pop(SqStack *L, ElemType *e)
{
if (L->top != L->base)
{
e = --L->top;
}

}

int StackEmpty(SqStack *L)
{
if (L->top == L->base)
return 1;
else
return 0;
}

int InOrderTraverse(BiTNode *T)
{
SqStack *L;
L = (SqStack *)malloc(sizeof(SqStack));
BiTree p;
InitStack(L); p = T;
while (p || !StackEmpty(L))
{
if (p) { Push(L, p); p = p->lchild; } // 非空指针进栈,继续左进
else { // 上层指针退栈,访问其所指结点,再向右进
Pop(L, p);
if (!printf("%c",p->data)) return 1 ;
p = p->rchild;
}
}
return 0;
}

void main()
{
BiTree T;
T = (BiTree)malloc(sizeof(BiTNode));
CreateBiTree(T);
InOrderTraverse(T);
printf("WSQ");
getchar();

}


解决方案

晕这么长,还真不好看。建议楼主学会调试程序,设断点、单步执行等手段。

解决方案二:

以后楼主发程序可以用代码段发 还是先学会调试吧

时间: 2024-10-21 09:04:21

c-先序建的树,中序遍历,为啥在Push处会中断运行啊的相关文章

[算法系列之三]二叉树中序前序序列(或后序)求解树

[思路] 这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:   1.先序遍历   (1)访问根结点:   (2)先序遍历左子树:   (3)先序遍历右子树.   2.中序遍历   (1)中序遍历左子树:   (2)访问根结点:   (3)中序遍历右子树.   3.后序遍历   (1)后序遍历左子树:   (2)后序遍历右子树:   (3)访问根结点.   知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和

C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法

本博文来总结下树.二叉树以及二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 1.什么是树?什么是二叉树? 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合. 二叉树是指结点的度不超过2的有序树. (结点的度:树中的一个结点拥有的子树数目.) 2.二叉树的前序.中序.后序遍历的特性  二叉树前序遍历特性:   (1).访问根节点  (2).前序遍

中序 后序 二叉树-中序,后序确定一颗树

问题描述 中序,后序确定一颗树 我实现了基于前序和中序的代码 代码如下 public static TreeNode buildTree(int[] preorder, int[] inorder){ return buildTree(preorder, 0, inorder,0, preorder.length); } public static TreeNode buildTree(int[] preorder,int prestart, int[] inorder,int instart,

中序遍历递增可以判断一棵树是BST树吗

问题描述 中序遍历递增可以判断一棵树是BST树吗 看到有这种算法,但是还看见有人这是错误的,因为不是BST也会有中序遍历递增的情况,我只想到必须要是前提需要是二叉树,不知道谁能举个例子吗? 解决方案 中序遍历严格递增即可判定就是BST树 解决方案二: 判断一棵树是否BST判断树是否是另外一棵树的子树判断一棵树是否是BST 解决方案三: 请看下面的链接: 1) http://blog.csdn.net/stpeace/article/details/9067029 2) http://blog.c

二叉树的遍历详解(前序中序后序层次-递归和非递归)

二叉树 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点 前序遍历 前序遍历按照"根结点-左孩子-右孩子"的顺序进行访问. 递归实现 void PreOrder(Tree

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性:  前序遍历:      1.访问根节点      2.前序遍历左子树      3.前序遍历右子树  中序遍历:      1.中序遍历左子树      2.访问根节点      3.中序遍历右子树  后序遍历:      1.后序遍历左子树      2.后序遍历右

二叉树中序线索化算法

// // 二叉树线索化的头文件:BinaryThreadTree.h #ifndef B_T_T_H #define B_T_T_H #include <stdio.h> // // 返回OK表示正常返回 #define OK 1 // // 返回ERROR,表示异常返回 #define ERROR 0 // // 返回OVERFLOW,表示内存溢出 #define OVERFLOW -1 // // 线索结构体 typedef enum { Link = 0, // 指针 Thread =

二叉树的应用-先序遍历中序遍历还原二叉树

二叉树的一些应用 还是大实验要求的 还有已知先序遍历 中序遍历求后续遍历 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAX 100 //节点个数 #define Null 0 typedef int Elemtype; class node { public: Elemtype data; no