69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef struct threaded_binary_tree btthreaded_t;
typedef void (*visitor_t)(btthreaded_t *);
typedef char bt_elem_t;
struct threaded_binary_tree {
btthreaded_t *l, *r;
int ltag, rtag; /* tag=0: child; tag=1: threaded */
bt_elem_t e;
};
#define NIL_ELEM(e) ((e) == ' ')
void btthreaded_create(btthreaded_t** root, bt_elem_t** elems, int* elemnum)
{
if (*elemnum == 0) return; // no more elements
if (NIL_ELEM(**elems)) {
*root = NULL;
(*elems)++; (*elemnum)--;
} else {
// m-node
*root = (btthreaded_t*)malloc(sizeof(btthreaded_t));
(*root)->e = *(*elems)++; (*elemnum)--;
(*root)->ltag = (*root)->rtag = 0;
// (l, r)-nodes
btthreaded_create(&((*root)->l), elems, elemnum); // l-tree
btthreaded_create(&((*root)->r), elems, elemnum); // r-tree
}
}
void inorder_travel(btthreaded_t* root, visitor_t visitor)
{
if (root == NULL) return;
inorder_travel(root->l, visitor);
if (visitor) visitor(root);
inorder_travel(root->r, visitor);
}
static void do_thread(btthreaded_t* root, btthreaded_t** prev)
{
assert(prev);
if (root)
{
do_thread(root->l, prev);
if (root->l == NULL) { // the previous
root->ltag = 1;
root->l = *prev;
}
if (*prev && (*prev)->r == NULL) { // the posterior
(*prev)->rtag = 1;
(*prev)->r = root;
}
*prev = root;
do_thread(root->r, prev);
}
}
void inorder_thread(btthreaded_t* root)
{
btthreaded_t *prev;
if (root == NULL) return;
prev = NULL;
do_thread(root, &prev);
prev->r = NULL;
prev->rtag = 1;
}
void print_node(btthreaded_t *node)
{
if (node == NULL) return;
putchar(node->e);
//putchar(node ? node->e : ' ');
}
int main(void)
{
btthreaded_t *root = NULL;
/* A
* / \
* B C
* / / \
* D E F
*/
bt_elem_t *elems = "ABD CE F ";
size_t elemnum = strlen(elems);
visitor_t visitor = print_node;
btthreaded_create(&root, &elems, &elemnum);
inorder_travel(root, print_node);
inorder_thread(root);
getch();
return 0;
}
供参考。