心动C++: 情牵二叉树(C Language)

/*-----------------------------------------------------------------------------
 * Project: TwoTree.h
 * Name: zwp
 * Date: 2013.6
 *------------------------------------------------------------------------------*/


#ifndef TWOTREE_H_
#define TWOTREE_H_

/*
** 元素类型
*/
typedef int ElementType;

/*
** 节点类型
*/
typedef struct TreeNode
{
	ElementType Element;
	struct TreeNode* Left;
	struct TreeNode* Right;

}*SearchTree;


/*
** 初始化树
*/
SearchTree Initialize(SearchTree Tree);
/*
** 建立一棵空树
*/
SearchTree MakeEmpty(SearchTree Tree);

/*
** 判断树是否为空
*/
int IsEmpty(SearchTree Tree);

/*
** 查找元素
*/
SearchTree Find(ElementType value, SearchTree Tree);

/*
** 找最小的元素
*/
SearchTree FindMin(SearchTree Tree);

/*
** 找最大的元素
*/
SearchTree FindMax(SearchTree Tree);

/*
** 插入元素的二叉树中
*/
SearchTree Insert(ElementType value, SearchTree Tree);

/*
** 删除元素
*/
SearchTree Delete(ElementType value, SearchTree Tree);

/*
** 遍历二叉树
*/
void PrintTree(SearchTree Tree);



#endif

/*--------------------------------------------------------------------------- * Project: TwoTree.c * Name: zwp * Date: 2013.6 *----------------------------------------------------------------------------*/#include <stdio.h>#include <stdlib.h>#include "TwoTree.h"static void PrintElement(ElementType value);SearchTree Initialize(SearchTree Tree){Tree->Element = 0;Tree->Left = NULL;Tree->Right = NULL;return Tree;}SearchTree MakeEmpty(SearchTree Tree){if(Tree != NULL){MakeEmpty(Tree->Left);MakeEmpty(Tree->Right);free(Tree);}return NULL;}SearchTree Find(ElementType value, SearchTree Tree){if(Tree == NULL) // 若为空树return NULL;if(value < Tree->Element) /* 若小于根节点元素,就向左子枝查找 */return Find(value, Tree->Left);else if(value > Tree->Element) /* 若大于根节点元素,就向右子枝查找 */return Find(value, Tree->Right);else /* 否则 */return Tree;}SearchTree FindMin(SearchTree Tree){/*** 因为二叉查找树的顺序为 左 < 中 < 右 所以最小的节点就在左子树了*/if(Tree == NULL)return NULL;else if(Tree->Left == NULL)return Tree;elsereturn FindMin(Tree->Left);}SearchTree FindMax(SearchTree Tree){/*** 因为二叉查找树的顺序为 左 < 中 < 右 所以最大的节点就在右子树了*/if(Tree != NULL)while(Tree->Right != NULL)Tree = Tree->Right;return Tree;}SearchTree Insert(ElementType value, SearchTree Tree){if(Tree == NULL){/*** 创建一个节点并返回给树返回一个节点*/Tree = (SearchTree)malloc(sizeof(struct TreeNode));if(Tree == NULL)printf("Out of space..\n");else{Tree->Element = value;Tree->Left = Tree->Right = NULL;}}else if(value < Tree->Element) // 小于根节点插入左边Tree->Left = Insert(value, Tree->Left);else if(value > Tree->Element) // 大于根节点插入右边Tree->Right = Insert(value, Tree->Right);elseprintf("%d is in the Tree.\n", value);return Tree;}SearchTree Delete(ElementType value, SearchTree Tree){SearchTree TmpCell;if(Tree == NULL)printf("Element not found..\n");else if(value < Tree->Element) // 去左边Tree->Left = Delete(value, Tree->Left);else if(value > Tree->Element) // 去右边Tree->Right = Delete(value, Tree->Right);else{/* 找到元素删除它 */if(Tree->Left && Tree->Right) // 有两个孩子{/*** 将其替换为右边最小的元素,将右边最小的元素删除*/TmpCell = FindMin(Tree->Right);Tree->Element = TmpCell->Element;Tree->Right = Delete(Tree->Element, Tree->Right);}else{ // 有一个或零个孩子TmpCell = Tree;if(Tree->Left == NULL)Tree = Tree->Right;else if(Tree->Right == NULL)Tree = Tree->Left;free(TmpCell);}}return Tree;}int IsEmpty(SearchTree Tree){return (Tree == NULL) ? 0 : 1;}void PrintTree(SearchTree Tree){if(Tree != NULL){PrintTree(Tree->Left);PrintElement(Tree->Element);PrintTree(Tree->Right);}}static void PrintElement(ElementType value){printf("%d ", value);}


/*---------------------------------------------------------------------------- * Project: Test.c * Name: zwp * Date: 2013.6 *----------------------------------------------------------------------------*/#include <stdio.h>#include <stdlib.h>#include "TwoTree.h"int main(void){int index = 0;SearchTree Tree = (SearchTree)malloc(sizeof(struct TreeNode));Tree = Initialize(Tree);/*** 很不辛在插入10000个元素时就会 Stack OverFlow (都是递归惹的祸)*/for(index = 0; index < 1000; ++ index)Insert(index, Tree);PrintTree(Tree);MakeEmpty(Tree);system("pause");return 0;}


                                    既然选择了方向,便只顾风雨兼程!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值