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