树--二叉树

1、二叉树

二叉树是一颗树。其中每个节点不能有多于两个的儿子。

二叉树的单节点实现:

typedef struct TreeNode *PtrToNode;
typedef struct PtrToNode Tree;
struct TreeNode
{
	ElementType Element;
	Tree left;
	Tree right;
}

2、二叉查找树

       二叉树的一个重要应用就是他们在查找中的使用。使二叉树成为二叉查找树的性质使,对于树中的每个节点X,他的左子树的关键字值小于X的关键字,而它的右子树所有关键字值大于X的关键字。基本实现如下

#ifndef SEARCH_TREE_H
#define SEARCH_TREE_H
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree; 

SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType x,SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType X,SearchTree T);
SearchTree Delete(ElementType X,SearchTree T);



struct TreeNode{
	ElementType Element;//key
	SearchTree Left;//left tree
	SearchTree Right;//right tree
}


#endif


// make empty
SearchTree MakeEmpty(SearchTree T)
{
	if(T!=NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}
// find X return Position of the Tree
Position Find(ElementType x,SearchTree T)
{
	if(T)
	{
		return NULL;
	}
	if(X>T->Right)
		return Find(X,T->Right);
	else
		if(X<T->Left)
			return Find(X,T->Left);
		else 
			return T;
}


//
Position FindMax(SearchTree T)
{
	if(T)
		return NULL;
	else 
		if(T->Right==NULL)
		return T;
	else 
		return FindMax(T->Right);
}
//
Position FindMin(SearchTree T)
{
	if(T)
		return NULL;
		while(T->Left!=NULL)
			T=T->Left;
	return T;
}


//
/*插入之前判断树是否为空,若为空建立新的节点储存要插入的元素的值,并且初始化节点的子节点指向NULL,结束返*****回T,若不为空递归查找X应插入的位置找到之后再插入*/
SearchTree Insert(ElementType X,SearchTree T)
{
	if(T=NULL)
	{
		T=malloc(sizeof(struct TreeNode));
		if(T==NULL)
			printf("OUR OF SPACE!!");
		else{
			T->ElementType =X;
			T->Left=NULL;
			T->Right=NULL;
			
		}
		
	}
	else if(X<T->ElementType)
		T->Left=Insert(X,T->Left);
	else if(X>T->ElementType)
		T->Right=Insert(X,T->Right);
	
	return T;
}
//
/*删除操作分两种情况,首先递归找到要删除的节点,如果该节点有两个子树,则用其右子树的最小值来代替该节点的****数据并递归的删除那个节点,因为右子树最小值不可能再有左儿子,此时双节点变成单节点,单节点的删除则用中****间变量记录删除的节点位置,改变指针,若无左子树则指向右子树若无右子树则指向左子树,free中间变量记录*******的位置*/
SearchTree Delete(ElementType X,SearchTree T)
{
	Position Tmpcell;
	if(T==NULL)
		printf("Element not found");
	else if(X>T->Right)
		T->Right=Delete(X,T->Right);
	else if(X<T->Left)
		T->Left=Delete(X,T->Left);
	else /*found element to be delete*/
		if(T->Left&&T->Right)
		{
			Tmpcell=FindMin(T->Right);
			T->Element=Tmpcell->Element;
			T->Right=Delete(T->Element,T->Right);
		}
	else /*one or zero children*/
	{
		Tmpcell=T;
		if(T->Left==NULL)
			T=T->Right;
		else if(T->Right==NULL)
			T=T->Left;
		
	}
	return T;
		
}

和其他数据结构一样,插入和删除是稍微复杂一点的工作。期末考试荒废了好长时间,开始慢慢耕耘吧。

猜你喜欢

转载自blog.csdn.net/zl6481033/article/details/81001243