weixin_54541337 2023-01-03 19:42 采纳率: 50%
浏览 23

二叉树真难,我真的不会

为什么非递归二叉树遍历我这里输出不全,字母之间多加一个#号就出问题了

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;
}

img

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2023-01-03 21:19
    关注

    栈结构体是啥样的?修改如下,供参考:

    #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;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 1月3日