现在的位置: 首页 > 综合 > 正文

二叉查找树

2012年10月26日 ⁄ 综合 ⁄ 共 5008字 ⁄ 字号 评论关闭

刚把数据结构c语言描述的二叉查找树这一部分看完,书上的给出了函数的定义,我都实现了一遍,有递归的和非递归的两种,源代码贴上来,留作纪念了。源文件有比较详细的注释,但是在Live Writer里面显示是乱码,希望在网页上不是乱码

tree.h头文件内容:

#ifndef _Tree_H
#define _Tree_H

typedef int ElementType;

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;


SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X,SearchTree T);
Position Find_No(ElementType X,SearchTree T);
Position FindMin(SearchTree T);
Position FindMin_No(SearchTree T);
Position FindMax(SearchTree T);
Position FindMax_No(SearchTree T);
SearchTree Insert(ElementType X,SearchTree T);
SearchTree Insert_No(ElementType X,SearchTree T);
SearchTree Delete(ElementType X,SearchTree T);
SearchTree Delete_No(ElementType X,SearchTree T);
ElementType Retrieve(Position P);
ElementType Retrieve_No(Position P);
Position Find_Prev(ElementType X,SearchTree T);

#endif

struct TreeNode
{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};

 

tree.c源文件的内容:

#include "tree.h"
#include 
#include 


//????????
SearchTree MakeEmpty(SearchTree T)
{
	if(T != NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}


//????X??????,??
Position Find(ElementType X,SearchTree T)
{
	if(T == NULL)
		return NULL;
	if(X Element)
		return Find(X,T->Left);
	else if(X > T->Element)
		return Find(X,T->Right);

	return T; 
}

//????X??????,???
Position Find_No(ElementType X,SearchTree T)
{
	Position ret = NULL;
	if(T == NULL)
		return T;
	if(X == T->Element)
		return T;
	else if(X Element)
	{
		Position p1 = T->Left;//???????,p1????
		
		while (X != p1->Element)
			p1 = p1->Left;
		
		ret = p1;
	}
	else if(X > T->Element)
	{
		Position p2 = T->Right;//???????,p2????
		
		while(X != p2->Element)
			p2 = p2->Right;

		ret = p2;
	}
	return ret;
}


//??????????,???
Position FindMin_No(SearchTree T)
{
	if(T == NULL)
		return NULL;
	Position p = T->Left;
	Position cur = NULL;
	while(p != NULL)
	{
		cur = p;
		p = p->Left;
	}
	return cur;
}


//??????????,??
Position FindMin(SearchTree T)
{
	if(T == NULL)
		return NULL;
	else if(T->Left == NULL)
		return T;
	else
	return FindMin(T->Left);
}


//??????????,???
Position FindMax_No(SearchTree T)
{
	if(T == NULL)
		return NULL;
	Position p = T->Right;
	Position cur = NULL;
	while(p != NULL)
	{
		cur = p;
		p = p->Right;
	}
	return cur;
}

//??????????,??
Position FindMax(SearchTree T)
{
	if(T == NULL)
		return NULL;
	else if(T->Right == NULL)
		return T;
	else
		return FindMax(T->Right);
}

//??
SearchTree Insert(ElementType X,SearchTree T)
{
	Position p1 = NULL;
	Position p2 = NULL;
	if(T == NULL)
	{
		T = (SearchTree)malloc(sizeof(TreeNode));
		if(T != NULL)	
		{
			T->Element = X;
			T->Left = NULL;
			T->Right = NULL;
		}
		else
			return NULL;
	}
	else
	{
		Position node;
		node = (Position)malloc(sizeof(TreeNode));
		node->Element = X;
		node->Left = NULL;
		node->Right = NULL;
		
		if(X Element)
		{
			p1 = T->Left;
			Position cur = NULL;
			while(p1 != NULL)
			{
				if(X Element)
				{
					cur = p1;
					p1 = p1->Left;
				}

				else if(X > p1->Element)
				{
					cur = p1;
					p1 = p1->Right;
				}
				else
					return p1;
			}
			if(X > cur->Element)
				cur->Right = node;
			else
				cur->Left = node;
		}
		else if(X > T->Element)
		{
			p2 = T->Right;
			Position cur = NULL;
			while(p2 != NULL)
			{
				if(X Element)
				{
					cur = p2;
					p2 = p2->Left;
				}
				else if(X > p2->Element)
				{
					cur = p2;
					p2 = p2->Right;
				}
				else
					return p2;
			}
			if(X > cur->Element)
				cur->Right = node;
			else
				cur->Left = node;
		}
			
	}
	return T;
}

//????X?????????,???
Position Find_Prev(ElementType X,SearchTree T)
{
	if(T == NULL)
		return T;
	if(X Element)
	{
		Position p1 = T->Left;
		while (X != p1->Element)
			p1 = p1->Left;
		return p1;
	}
	else if(X > T->Element)
	{
		Position p2 = T->Right;
		while(X != p2->Element)
			p2 = p2->Right;
		return p2;
	}
	else
		return T;
}


//??????
SearchTree Delete(ElementType X,SearchTree T)
{
	Position X_pos = NULL;
	Position ret = NULL;
	if(T == NULL)
		return NULL;
	X_pos = Find(X,T);
	if(X_pos == NULL)
		return NULL;

	if(X_pos->Left == NULL && X_pos->Right == NULL)//??????????,???????
	{
		ret = X_pos;
		free(X_pos);
		X_pos = NULL;
	}
	else if(X_pos->Left == NULL || X_pos->Right == NULL)//???????
	{
		Position prev = Find_Prev(X,T);//????????????
		if(prev->Right == X_pos)//?????????????
		{
			//?????????????????????????
			if(X_pos->Right != NULL)
				prev->Right = X_pos->Right;
			else if(X_pos->Left != NULL)
				prev->Right = X_pos->Left;
		}
		else if(prev->Left == X_pos)
		{
			if(X_pos->Right != NULL)
				prev->Left = X_pos->Right;
			else if(X_pos->Left != NULL)
				prev->Left = X_pos->Left;
		}
		free(X_pos);//?????????,?X_pos??NULL
		X_pos = NULL;
	}
	else if(X_pos->Left != NULL && X_pos->Right != NULL)//???????
	{
		Position ptr_min = FindMin_No(X_pos->Right);//??????????????????
		X_pos->Element = ptr_min->Element;
		Position ptr_min_prev = Find_Prev(ptr_min->Element,X_pos->Right);
		if(ptr_min_prev->Right == ptr_min)
		{
			if(ptr_min->Right != NULL)
				ptr_min_prev->Right = ptr_min->Right;
			else if(ptr_min->Left != NULL)
				ptr_min_prev->Right = ptr_min->Left;
		}
		else if(ptr_min_prev->Left == ptr_min)
		{
			if(ptr_min->Right != NULL)
				ptr_min_prev->Left = ptr_min->Right;
			else if(ptr_min->Left != NULL)
				ptr_min_prev->Left = ptr_min->Left;
		}
		free(X_pos);
		X_pos = NULL;
	}
	return T;
}


void Output(SearchTree T)
{

	if(T != NULL)
	{
		printf("%d /n",T->Element);
		Output(T->Left);
		Output(T->Right);
	}
}


int main()
{
	SearchTree T = NULL;
	T = (SearchTree)malloc(sizeof(struct TreeNode));
	struct TreeNode Node1;
	struct TreeNode Node2;
	struct TreeNode Node3;
	struct TreeNode Node4;
	struct TreeNode Node5;
	
	
	Node1.Element = 1;
	Node2.Element = 2;
	Node3.Element = 3;
	Node4.Element = 4;
	Node5.Element = 8;

	T->Element = 6;
	T->Left = &Node2;
	T->Right = &Node5;
	
	Node5.Left = NULL;
	Node5.Right = NULL;

	Node1.Left = NULL;
	Node1.Right = NULL;

	Node3.Left = NULL;
	Node3.Right = NULL;

	Node2.Left = &Node1;
	Node2.Right = &Node4;

	Node4.Left = &Node3;
	Node4.Right = NULL;

	Output(T);

	SearchTree Tptr;
	int val = 7;
	Tptr = Insert(val,T);
	Output(T);

	Position min;
	min = FindMin_No(T);
	printf("/n%d/n",min->Element);

	Position max;
	max = FindMax_No(T);
	printf("/n%d/n",max->Element);
	return 0;
}

抱歉!评论已关闭.