c语言实现中序线索二叉树的构造

ThreadTree.c


//
// Created by Carry on 2021/10/26.
// 线索二叉树
//

#include "stdio.h"
#include "stdlib.h"

typedef int ElemType;
typedef struct ThreadNode {
    ElemType data;
    struct ThreadNode *lchild, *rchild;
    int ltag, rtag;
} ThreadNode, *ThreadTree;

typedef struct Index {
    ThreadTree index;
} Index;

void InThread(ThreadTree p, Index *pre) {
    if (p != NULL) {
        InThread(p->lchild, pre);
        if (p->lchild == NULL) {
            p->lchild = pre->index;
            p->ltag = 1;
        }

        if (pre->index != NULL && pre->index->rchild == NULL) {
            pre->index->rchild = p;
            pre->index->rtag = 1;
        }
        pre->index = p;
        InThread(p->rchild, pre);
    }

}


void CreateThread(ThreadTree T) {
    Index *pre = (Index *) malloc(sizeof(Index));
    pre->index = NULL;
    if (T != NULL) {
        InThread(T, pre);
        pre->index->rchild = NULL;
        pre->index->rtag = 1;
        free(pre);
    }
}

ThreadNode *Firstnode(ThreadNode *p) {
    while (p->ltag == 0) {
        p = p->lchild;
    }
    return p;
}


ThreadNode *Nextnode(ThreadNode *p) {
    if (p->rtag == 0) {
        return Firstnode(p->rchild);

    } else return p->rchild;
}

void Inorder(ThreadNode *T) {
    for (ThreadNode *p = Firstnode(T); p != NULL; p = Nextnode(p)) {
        printf("%d ", p->data);
    }
}

int main() {

    ThreadTree node1 = (ThreadTree) malloc(sizeof(ThreadNode));
    node1->data = 3;
    ThreadNode node2;
    ThreadNode node3;
    ThreadNode node4;
    node2.data = 4;
    node3.data = 8;
    node4.data = 10;
    node1->lchild = &node2;
    node1->rchild = &node3;
    node2.lchild = &node4;
//    node2.rchild = node3.lchild = node3.rchild = node4.rchild = node4.lchild = NULL;
//    print_tree(node1);
    node2.rchild = node3.lchild = node3.rchild = node4.rchild = node4.lchild = NULL;
    node1->rtag = node1->ltag = node2.rtag = node2.ltag = node3.rtag = node3.ltag = node4.rtag = node4.ltag = 0;

    CreateThread(node1);
    Inorder(node1);

    return 0;
}

心得体会

c语言不要总是想着用默认值
所有变量都应该先赋值在使用。这样可以避免很多不必要的麻烦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值