算法导论C语言实现: 二叉搜索树(binary tree)
来源:互联网 发布:illustrator破解版mac 编辑:程序博客网 时间:2024/05/22 05:27
1. 源代码
ia_binarytree.h
#ifndef __IA_BINARY_TREE_H__#define __IA_BINARY_TREE_H__#include <common.h>typedef struct _binary_tree_node_t {int key;struct _binary_tree_node_t *p;struct _binary_tree_node_t *left;struct _binary_tree_node_t *right;} binary_tree_node_t;typedef struct _binary_tree_t {binary_tree_node_t *root;} binary_tree_t;void ia_binary_tree_inorder_walk(binary_tree_node_t *x, FILE *f);binary_tree_node_t *ia_binary_tree_search(binary_tree_node_t *x, int k);binary_tree_node_t *ia_binary_tree_iterative_search(binary_tree_node_t *x, int k);//x must not be NIL(NULL)binary_tree_node_t *ia_binary_tree_minimum(binary_tree_node_t *x);//x must not be NIL(NULL)binary_tree_node_t *ia_binary_tree_maximum(binary_tree_node_t *x);binary_tree_node_t *ia_binary_tree_successor(binary_tree_node_t *x);binary_tree_node_t *ia_binary_tree_predecessor(binary_tree_node_t *x);void ia_binary_tree_insert(binary_tree_t *T, binary_tree_node_t *z);void ia_binary_tree_delete(binary_tree_t *T, binary_tree_node_t *z);#endif/* __IA_BINARY_TREE_H__ */
ia_binarytree.c
#include <ia_binarytree.h>void ia_binary_tree_inorder_walk(binary_tree_node_t *x, FILE *f){const char* s_1 = "child {\nnode [arn_n] {";const char* s_1_space = "child {\nnode [arn_x] {";const char* s_2 = "}\n";//const char* s_3 = "}\r\n";char s_v[20];if (x != NIL) {if (f == NULL) {ia_binary_tree_inorder_walk(x->left, f);TRACE(" %d", x->key);ia_binary_tree_inorder_walk(x->right, f);} else {sprintf_s(s_v, sizeof(s_v), "%d", x->key);fputs(s_1, f);fputs(s_v, f);fputs(s_2, f);//print childrenia_binary_tree_inorder_walk(x->left, f);ia_binary_tree_inorder_walk(x->right, f);fputs(s_2, f);}} else {if (f != NULL) {fputs(s_1_space, f);fputs(s_2, f);fputs(s_2, f);}}}binary_tree_node_t *ia_binary_tree_search(binary_tree_node_t *x, int k){if (x == NIL || k == x->key) {return x;}if (k < x->key) {return ia_binary_tree_search(x->left, k);} else {return ia_binary_tree_search(x->right, k);}}binary_tree_node_t *ia_binary_tree_iterative_search(binary_tree_node_t *x, int k){while (x != NIL && k != x->key) {x = (k < x->key)?x->left:x->right;}return x;}//x must not be NIL(NULL)binary_tree_node_t *ia_binary_tree_minimum(binary_tree_node_t *x){while (x->left != NIL) {x = x->left;}return x;}//x must not be NIL(NULL)binary_tree_node_t *ia_binary_tree_maximum(binary_tree_node_t *x){while (x->right != NIL) {x = x->right;}return x;}binary_tree_node_t *ia_binary_tree_successor(binary_tree_node_t *x){binary_tree_node_t *y = NIL;if (x->right != NIL) {return ia_binary_tree_minimum(x->right);}y = x->p;while (y != NIL && x == y->right) {x = y;y = y->p;}return y;}binary_tree_node_t *ia_binary_tree_predecessor(binary_tree_node_t *x){binary_tree_node_t *y = NIL;if (x->left != NIL) {return ia_binary_tree_maximum(x->left);}y = x->p;while (y != NIL && x == y->left) {x = y;y = y->p;}return y;}void ia_binary_tree_insert(binary_tree_t *T, binary_tree_node_t *z){binary_tree_node_t *x = T->root;binary_tree_node_t *y = NIL;while (x != NIL) {y = x;if (z->key < x->key) {x = x->left;} else {x = x->right;}}z->p = y;if (y == NIL) {T->root = z;//tree T is empty} else if (z->key < y->key) {y->left = z;} else {y->right = z;}}static void ia_binary_tree_transplant(binary_tree_t *T,binary_tree_node_t *u,binary_tree_node_t *v){if (u->p == NIL) {T->root = v;} else if (u == u->p->left) {u->p->left = v;} else {u->p->right = v;}if (v != NIL) {v->p = u->p;}}void ia_binary_tree_delete(binary_tree_t *T, binary_tree_node_t *z){binary_tree_node_t *y = NIL;if (z->left == NIL) {ia_binary_tree_transplant(T, z, z->right);} else if (z->right == NIL) {ia_binary_tree_transplant(T, z, z->left);} else {y = ia_binary_tree_minimum(z->right);if (y->p != z) {ia_binary_tree_transplant(T, y,y->right);y->right = z->right;z->right->p = y;}ia_binary_tree_transplant(T, z, y);y->left = z->left;y->left->p = y;}}
test.c
#include <ia_include.h>#define TEST_IASTACK_SIZE10#define TEST_IAQUEUE_SIZE10#define TEST_IABINARYTREE_NODES20void main(){int i = 0;/*iastack_t test_stack;iaqueue_t test_queue;TRACE("=========Test iastack=========\n");iastack_init(&test_stack, TEST_IASTACK_SIZE);for (i = 0; i < (TEST_IASTACK_SIZE); ++i) {iastack_push(&test_stack, i);}for (i = 0; i < (TEST_IASTACK_SIZE); ++i) {TRACE("%d\t", iastack_pop(&test_stack));}TRACE("\n");iastack_free(&test_stack);TRACE("=========Test iaqueque=========\n");iaqueue_init(&test_queue, TEST_IAQUEUE_SIZE);for (i = 0; i < (8); ++i) {iaqueue_enqueue(&test_queue, i);}for (i = 0; i < (5); ++i) {TRACE("%d\t", iaqueue_dequeue(&test_queue));}TRACE("\n");for (i = 0; i < (7); ++i) {iaqueue_enqueue(&test_queue, i);}for (i = 0; i < (5); ++i) {TRACE("%d\t", iaqueue_dequeue(&test_queue));}TRACE("\n");iaqueue_free(&test_queue);*/FILE *f_out = NULL;binary_tree_t T;binary_tree_node_t t_nodes[TEST_IABINARYTREE_NODES];int nodes_v[TEST_IABINARYTREE_NODES] = { 5, 3, 4, 8, 1, 20, 33, 30, 34, 28, 8, 33, 11, 24, 11, 10, 12, 18, 22, 23 };T.root = NIL;memset(t_nodes, 0, sizeof(t_nodes));for (i = 0; i < sizeof(t_nodes)/sizeof(binary_tree_node_t); ++i) {t_nodes[i].key = nodes_v[i];ia_binary_tree_insert(&T, &t_nodes[i]);}f_out = fopen("out.txt", "w+");if (f_out == NULL) {TRACE("Fail to create file out.txt\nQuit!");goto l_exit;}ia_binary_tree_inorder_walk(T.root, NULL);//ia_binary_tree_inorder_walk(T.root, f_out);printf("\n\n");ia_binary_tree_delete(&T, &t_nodes[5]);ia_binary_tree_inorder_walk(T.root, NULL);ia_binary_tree_inorder_walk(T.root, f_out);l_exit:if (f_out != NULL) {fclose(f_out);}printf("\n\n");system("pause");}
2.输出
3. Tikz画图脚本
请参考:http://www.texample.net/tikz/examples/red-black-tree/
\tikzset{ treenode/.style = {align=center, inner sep=0pt, text centered, font=\sffamily}, arn_b/.style = {treenode, circle, white, font=\sffamily\bfseries, draw=black, fill=black, text width=2em},% arbre rouge noir, noeud noir arn_r/.style = {treenode, circle, red, draw=red, text width=1.5em, very thick},% arbre rouge noir, noeud rouge arn_x/.style = {treenode, rectangle, draw=black, minimum width=0.5em, minimum height=0.5em},% arbre rouge noir, nil arn_n/.style = {treenode, circle, black, draw=black, text width=2em, very thick}}\begin{document}\begin{tikzpicture} [->,>=stealth',level/.style={sibling distance = 20cm/#1, level distance = 1.5cm}]\node [arn_n] {root}child {node [arn_n] {5}child {node [arn_n] {3}child {node [arn_n] {1}child {node [arn_x] {}}child {node [arn_x] {}}}child {node [arn_n] {4}child {node [arn_x] {}}child {node [arn_x] {}}}}child {node [arn_n] {8}child {node [arn_x] {}}child {node [arn_n] {22}child {node [arn_n] {8}child {node [arn_x] {}}child {node [arn_n] {11}child {node [arn_n] {10}child {node [arn_x] {}}child {node [arn_x] {}}}child {node [arn_n] {11}child {node [arn_x] {}}child {node [arn_n] {12}child {node [arn_x] {}}child {node [arn_n] {18}child {node [arn_x] {}}child {node [arn_x] {}}}}}}}child {node [arn_n] {33}child {node [arn_n] {30}child {node [arn_n] {28}child {node [arn_n] {24}child {node [arn_n] {23}child {node [arn_x] {}}child {node [arn_x] {}}}child {node [arn_x] {}}}child {node [arn_x] {}}}child {node [arn_x] {}}}child {node [arn_n] {34}child {node [arn_n] {33}child {node [arn_x] {}}child {node [arn_x] {}}}child {node [arn_x] {}}}}}}};\end{tikzpicture}
0 0
- 算法导论C语言实现: 二叉搜索树(binary tree)
- 二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
- 【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)
- 编程算法 - 二叉搜索树(binary search tree) 代码(C)
- [leetcode]Validate Binary Search Tree (判断有效二叉搜索树 C语言实现)
- 算法导论:c++实现二叉搜索树
- 二叉查找树(binary search tree (BST))--算法导论示例
- 二叉排序树/二叉查找树 (binary sort tree/ binary search tree)的C语言实现
- 编程算法 - 二叉搜索树(binary search tree) 集合(set)和映射(map) 代码(C)
- Binary Search Tree(BST)二叉搜索树的实现-java语言
- 【LeetCode-面试算法经典-Java实现】【098-Validate Binary Search Tree(验证二叉搜索树)】
- C语言二叉树实现及搜索算法
- 算法导论-----二叉搜索树
- 算法导论-----------二叉搜索树
- 算法导论 二叉搜索树
- 算法导论--二叉搜索树
- 【算法导论】二叉搜索树
- 算法导论二叉搜索树
- selenium js
- Android开源项目第二篇——工具库篇
- Android应用程序签名详解
- Apache和PHP网页的编码问题分析(转载)
- Lock、ReentrantLock和AbstractQueuedSynchronizer的源码要点分析整理
- 算法导论C语言实现: 二叉搜索树(binary tree)
- (7)Java多线程
- mysql主从复制
- Qt模块化笔记之core——Input/Output文件操作(3)
- fetch 和 lazy 配置用于数据的查询
- Linux /etc 目录详解
- 基于S5PV210的Android4.0 环境配置 问题
- Shell expr的用法
- 2014年个人的想法