六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 26|回复: 0

Threaded Binary Tree

[复制链接]

升级  59.33%

112

主题

112

主题

112

主题

举人

Rank: 3Rank: 3

积分
378
 楼主| 发表于 2013-1-26 12:36:52 | 显示全部楼层 |阅读模式
#include <stdio.h>enum pointer_tag { LINK, THREAD };struct node {  char* data;  struct node* lchild;  struct node* rchild;  enum pointer_tag ltag, rtag;};void visit(char* data) {  printf("%s ", data);}void traverse(struct node* head) {  struct node* p = head->lchild;  while (p != head) {    while (p->ltag == LINK)      p = p->lchild;    visit(p->data);    while (p->rtag == THREAD && p->rchild != head) {      p = p->rchild;      visit(p->data);    }    p = p->rchild;  }  printf("\n");}void set_node(struct node* node, char * data, struct node* lchild, struct node* rchild, enum     pointer_tag ltag, enum pointer_tag rtag) {  node->data = data;  node->lchild = lchild;  node->rchild = rchild;  node->ltag = ltag;  node->rtag = rtag;}/* *      + *     / \ *   a    b */void test_1() {  struct node root, node1, node2, node3;  set_node(&root, "r", &node1, &node3, LINK, THREAD);  set_node(&node1, "+", &node2, &node3, LINK, LINK);  set_node(&node2, "a", &root, &node1, THREAD, THREAD);  set_node(&node3, "b", &node1, &root, THREAD, THREAD);  traverse(&root);}/* *           - *         /   \ *        /     \ *      +       "/" *    /   \    /    \ *  a      *  e      f *       /   \ *      b     - *          /   \ *        c      d */void test_2() {  struct node root, node1, node2, node3, node4, node5, node6, node7, node8,               node9, node10, node11;  set_node(&root, "r", &node1, &node7, LINK, THREAD);  set_node(&node1, "-", &node2, &node3, LINK, LINK);  set_node(&node2, "+", &node4, &node5, LINK, LINK);  set_node(&node3, "/", &node6, &node7, LINK, LINK);  set_node(&node4, "a", &root, &node2, THREAD, THREAD);  set_node(&node5, "*", &node8, &node9, LINK, LINK);  set_node(&node6, "e", &node1, &node3, THREAD, THREAD);  set_node(&node7, "f", &node3, &root, THREAD, THREAD);  set_node(&node8, "b", &node2, &node5, THREAD, THREAD);  set_node(&node9, "-", &node10, &node11, LINK, LINK);  set_node(&node10, "c", &node5, &node9, THREAD, THREAD);  set_node(&node11, "d", &node9, &node1, THREAD, THREAD);  traverse(&root);}int main(int argc, const char *argv[]) {  test_1();  test_2();  return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表