m0_72322824 2023-04-14 10:20 采纳率: 70.6%
浏览 30
已结题

请问这个线索二叉树哪里有问题呢


#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef char BTType;

typedef struct BTree {
    BTType data;
    struct BTree* lchild, * rchild;
    int Ltag;
    int Rtag;
}BTNode;


void CreatBTree(BTNode** T) {

    char ch;
    scanf_s("%c", &ch, 1);
    if (ch == '#') {
        *T = NULL;
    }
    else {
        *T = (BTNode*)malloc(sizeof(BTNode));
        if (*T == NULL) {
            return;
        }
        else {
            (*T)->data = ch;
            (*T)->Ltag = 0;
            (*T)->Rtag = 0;
            CreatBTree(&(*T)->lchild);
            CreatBTree(&(*T)->rchild);
        }
    }
    return;
}
  

void inthreading(BTNode* T, BTNode** pre) {
    if (T){
        inthreading(T->lchild, pre);
    if (T->lchild == NULL) {
        T->Ltag = 1;
        T->lchild = *pre;

    }

    if ((*pre)->rchild == NULL && (*pre) != NULL) {
        (*pre)->Rtag = 1;
        (*pre)->rchild = T;
    }
    *pre = T;
    inthreading(T->rchild, pre);
}
}

int main() {
    BTNode* T;
    BTNode* pre = NULL;
    CreatBTree(&T);
    inthreading(T, &pre);
    pre->Rtag = 1;
    pre->rchild = NULL;
    return 0;
}

img

展开全部

  • 写回答

2条回答 默认 最新

  • 薛毅轩 2023-04-15 02:44
    关注

    这段代码存在两个问题:

    1. 函数 inthreading 中,对于线索化的前驱节点 pre 的判断不完整。当 T->lchildNULL 时,需要将 T 的标志位设为线索,并将 T 的左(前)继节点指针指向 pre

    2. 在主函数 main 中,没有调用函数 inthreading 进行二叉树的中序线索化操作,这会导致后面对中序遍历结果的输出不准确。

    以下是修改后的代码:

    
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef char BTType;
    typedef struct BTree {
        BTType data;
        struct BTree* lchild, * rchild;
        int Ltag;
        int Rtag;
    }BTNode;
    
    void CreatBTree(BTNode** T) {
        char ch;
        scanf_s("%c", &ch, 1);
        if (ch == '#') {
            *T = NULL;
        }
        else {
            *T = (BTNode*)malloc(sizeof(BTNode));
            if (*T == NULL) {
                return;
            }
            else {
                (*T)->data = ch;
                (*T)->Ltag = 0;
                (*T)->Rtag = 0;
                CreatBTree(&(*T)->lchild);
                CreatBTree(&(*T)->rchild);
            }
        }
        return;
    }
    
    void inthreading(BTNode* T, BTNode** pre) {
        if (T) {
            inthreading(T->lchild, pre);
            if (T->lchild == NULL) {
                T->Ltag = 1;
                T->lchild = *pre;
            }
    
            if (*pre != NULL && (*pre)->rchild == NULL) {
                (*pre)->Rtag = 1;
                (*pre)->rchild = T;
            }
    
            *pre = T;
            inthreading(T->rchild, pre);
        }
    }
    
    int main() {
        BTNode* T;
        CreatBTree(&T);
    
        // 初始化前驱节点,保存上一次遍历访问的节点
        BTNode* pre = NULL;
    
        // 进行中序线索化操作
        inthreading(T, &pre);
    
        // 输出结果
        printf("中序遍历结果:\n");
        BTNode* p = T;
        while (p) {
            while (p->Ltag == 0) {
                p = p->lchild;
            }
            printf("%c ", p->data);
            while (p->Rtag == 1 && p->rchild != NULL) {
                p = p->rchild;
                printf("%c ", p->data);
            }
            p = p->rchild;
        }
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月15日
  • 创建了问题 4月14日