为什么非递归二叉树遍历我这里输出不全,字母之间多加一个#号就出问题了
void push(StackNode *stacknode,TreeNode *treeList){
if(treeList->data!='#'){
stacknode->top=treeList;
stacknode->top++;
}
}
TreeNode* pop(StackNode *stacknode){
TreeNode *node;
stacknode->top--;
node=stacknode->top;
printf("出栈一个结点:%c\n",node->data);
return node;
}
void PreOrderIn(TreeNode *treeList){
StackNode *stacknode;
TreeNode *node;
stacknode=(StackNode *)malloc(sizeof(StackNode));
stacknode->top=(StackNode *)malloc(sizeof(StackNode)*MAXSIZE);
stacknode->down=stacknode->top;
if(treeList!=NULL){
push(stacknode,treeList);
}
while(stacknode!=NULL){
node=pop(stacknode);
if(node->rchild!=NULL){
push(stacknode,node->rchild);
}
if(node->lchild!=NULL){
push(stacknode,node->lchild);
}
}
}
TreeNode* create(TreeNode *treeList){
char value;
printf("请输入一个字符\n");
scanf(" %c",&value);//注意啊,回车也会被当作一个字符
if(value=='#'){
treeList=NULL;
}else{
treeList=(TreeNode *)malloc(sizeof(TreeNode));
treeList->data=value;
//由于每一层都有返回值,
//所以我们必须保存每次递归后的左右节点的值,否则链表就会连接不起来
treeList->lchild=create(treeList->lchild);
treeList->rchild=create(treeList->rchild);
}
return treeList;
}
int main(){
TreeNode *treeList;
treeList=create(treeList);
PreOrderIn(treeList);
return 0;
}
栈结构体是啥样的?修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef struct _TreeNode {
char data;
struct _TreeNode* lchild;
struct _TreeNode* rchild;
}TreeNode;
typedef struct _StackNode {
TreeNode* top[MAXSIZE]; //修改
//TreeNode* down; 修改
int length;
}StackNode;
void push(StackNode* stacknode, TreeNode* treeList) {
if (treeList != NULL) { //(treeList->data != '#') { 修改
stacknode->top[stacknode->length] = treeList; //修改
stacknode->length++; //修改
//stacknode->top++; //修改
}
}
TreeNode* pop(StackNode* stacknode) {
TreeNode* node;
if (stacknode->length != 0) //修改
stacknode->length--; //修改
node = stacknode->top[stacknode->length]; //修改
//printf("1--出栈一个结点:%c\n", node->data);
return node;
}
void PreOrderIn(TreeNode* treeList) {//非递归先序
StackNode* stacknode;
TreeNode* node;
stacknode = (StackNode*)malloc(sizeof(StackNode));
//stacknode->top = (StackNode*)malloc(sizeof(StackNode) * MAXSIZE);//修改
//stacknode->down = stacknode->top; //修改
stacknode->length = 0; //修改
if (treeList != NULL) {
push(stacknode, treeList);
while (stacknode->length != 0) { //(stacknode != NULL) //修改
node = pop(stacknode);
printf("2--出栈一个结点:%c\n", node->data); //修改
if (node->rchild != NULL) {
push(stacknode, node->rchild);
}
if (node->lchild != NULL) {
push(stacknode, node->lchild);
}
}
} //修改
}
TreeNode* create(TreeNode* treeList) {
char value;
printf("请输入一个字符\n");
scanf(" %c", &value);//注意啊,回车也会被当作一个字符
if (value == '#') {
treeList = NULL;
}
else {
treeList = (TreeNode*)malloc(sizeof(TreeNode));
treeList->data = value;
//由于每一层都有返回值,
//所以我们必须保存每次递归后的左右节点的值,否则链表就会连接不起来
treeList->lchild = create(treeList->lchild);
treeList->rchild = create(treeList->rchild);
}
return treeList;
}
int main() {
TreeNode* treeList;
treeList = create(treeList);
PreOrderIn(treeList);
return 0;
}