您的位置:首页 > 其它

二叉搜索树-链式结构实现方式

2010-11-30 17:26 281 查看
实际上链式结构才是实现二叉树最常用的存储形式,它解决了数组存储中非常大的空间浪费,而且链式结构也非常符合二叉树的表现形式。下面是链式结构中常见的节点结构:

typedef struct TreeNode

{

TREE_TYPE value;

struct Tree *left;

struct Tree *right;

}TreeNode;

数组实现方式中的数组名这里使用一个指针代替,最初这个指针指向NULL表示是一个空树,当这个树不为空时,该指针指向根节点。

具体的实现方式:

/***使用动态分配的链式结构实现二叉树 */ #include  "tree.h"#include  <stdio.h>#include  <malloc.h>/***定义二叉树的结构体 */typedef struct TreeNode{TREE_TYPE  value;struct  TreeNode  *left;struct  TreeNode  *right; }TreeNode;/*指向根节点的指针*/static  TreeNode  *tree;/***insert函数的实现 */ int insert( TREE_TYPE value ){TreeNode  *current;TreeNode  **link;/*从根节点开始*/link = &tree;/*查找值进入合适的子树*/ while( (current = *link ) != NULL ) {/***根据情况进入左子树或右子树并确认没有重复值 */if( value < current->value ){link = ¤t->left;}else{if( value > current->value ){link = ¤t->right;}else{printf( "您需要插入的值已存在!/n" );return  FALSE;}} }current = (TreeNode *)malloc(sizeof(TreeNode));current->value = value;current->left = NULL;current->right = NULL;*link = current; }/*查找函数*/TREE_TYPE  *find( TREE_TYPE value ){TreeNode  *current;current = tree;while( (current != NULL) && (current->value != value) ){if( value < current->value ){current = current->left;}else{current = current->right;}}if( current != NULL ){return ¤t->value;}return  NULL;} /*前序遍历这里仍然采取打印出节点值来反映遍历的结果*/static void print( TREE_TYPE value ){printf( "%d/n", value );}/***前序遍历某一层 */ static  void do_pre_order_traverse( TreeNode *current, void(*print)( TREE_TYPE value ) ){if( current != NULL ){print( current->value );do_pre_order_traverse( current->left, print );do_pre_order_traverse( current->right, print ); }} /***前序遍历 */void pre_order_traverse( void ){/*从跟节点开始遍历*/do_pre_order_traverse( tree, print );} /***节点的删除 */ int delet( TREE_TYPE value ){TreeNode  *current;TreeNode  *pre_Node;current = tree;while( (current != NULL) && (current->value != value) ){/*存储父节点*/pre_Node = current;if( value < current->value ){current = current->left;}else{current = current->right;}}if( current == NULL ){printf( "没有找到要删除的值!/n" );}else{/*需删除的节点没有孩子*/if( (current->left == NULL) && (current->right == NULL) ){free( current );pre_Node->right = NULL;}else{/*如果有两个孩子*/if( (current->left !=NULL) && (current->right != NULL) ){TreeNode *link;TreeNode *pre_link;link = current->left;pre_link = current;  /*找出左子树中最大的值*/while( link->right != NULL ){pre_link = link;link = link->right;}/*找出的这个最大值又分为两种情况一种是有左孩子,一种是没有左孩子*/ current->value = link->value;if( pre_link == current ){pre_link->left = link->left;}else{pre_link->right = link->left;}free(link);} else{if( (current->left != NULL ) && (current->right == NULL ) ){pre_Node = current->left;free(current);}else{pre_Node = current->right;free(current);}}} } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: