二叉搜索树-链式结构实现方式
2010-11-30 17:26
281 查看
实际上链式结构才是实现二叉树最常用的存储形式,它解决了数组存储中非常大的空间浪费,而且链式结构也非常符合二叉树的表现形式。下面是链式结构中常见的节点结构:
typedef struct TreeNode
{
TREE_TYPE value;
struct Tree *left;
struct Tree *right;
}TreeNode;
数组实现方式中的数组名这里使用一个指针代替,最初这个指针指向NULL表示是一个空树,当这个树不为空时,该指针指向根节点。
具体的实现方式:
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);}}} } }
相关文章推荐
- 用链式结构实现二叉搜索树
- 使用动态分配的链式结构实现的二叉搜索树
- java语言实现简单单链表链式储存结构。插入删除等操作。(有个地方看不出错误来,已经标注,望指正)
- Java单链表顺序和链式实现(数据结构五)
- 初识树结构,简单模拟无规律的二叉树,实现二叉树的构建,计算树的深度以及三种遍历方式以及搜索删除,销毁整个树
- C语言 队列 链式结构 实现
- 线性结构--->循环队列的链式储存实现
- 数据结构—线性表的链式表示和实现
- 数据结构——二叉搜索树(BinarySearchTree)的实现
- 线性表——链式结构(c语言实现)
- 泛型实现内部链式栈存储结构
- Python 数据结构与算法——二叉搜索树的实现
- 大话数据结构 code 第五章 02二叉树链式结构实现_BiTreeLink
- 迎接2012之集合和泛型(2)------线性表的链式结构基本实现
- 数据结构之C/C++实现链式队列
- 线性表--链式实现方式
- 栈的链式存储结构以及实现
- 线性结构-栈的顺序存储和链式存储实现
- 队列的链式存储结构及实现
- 栈的链式存储结构及其基本运算的实现