搜索二叉树

      今天学到了搜索二叉树赶紧来巩固一下。

      简单介绍一下数据结构中的树 ,在《离散数学》中树的定义是:连通无回路的图 。

      树(tree)是包含n个结点的有穷集,其中 每个元素称为节点,树中边的条数 为 n – 1。

      相关术语:

      节点的度:一个节点含有的子树的个数称为该节点的度;

      叶节点或终端节点:度为0的节点称为叶节点;

      非终端节点或分支节点:度不为0的节点;

      双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

      孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

      兄弟节点:具有相同父节点的节点互称为兄弟节点;

      树的度:一棵树中,最大的节点的度称为树的度;

      节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

      树的高度或深度:树中节点的最大层次;

      堂兄弟节点:双亲在同一层的节点互为堂兄弟;

      节点的祖先:从根到该节点所经分支上的所有节点;

      子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

      来介绍一下二叉树 :每个节点最多含有两个子树的树称为二叉树。二叉树有完全二叉树和满二叉树;满二叉树是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树,完全二叉树是若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。

      好了那么什么是搜索二叉树呢?搜索二叉树(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。搜索二叉树可以方便的查找树中的最大值或最小值。

       今天学习的搜索二叉树的操作有:建树(搜索二叉树)查找最小(大)值删除节点

首先介绍建树(搜索二叉树):话不多说直接上代码:

typedef struct TNode *Position;
typedef Position BinTree;
typedef int ElementType;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree Insert( BinTree BST, ElementType X ){
	BinTree T = (BinTree)malloc(sizeof(struct TNode)); //创建一个用于储存X的节点。 
	T->Data = X;//初始化T 
	T->Left = NULL;
	T->Right = NULL;
	if (BST==NULL){//这是递归的终止条件 
		BST = T;
		return T;
	}

    if (BST->Data<X)BST->Right=Insert(BST->Right,X);//若数据大于该节点数据那么它肯定在节点的右边; 
    else BST->Left = Insert(BST->Left,X);//若数据小于该节点数据那么它肯定在节点的左边;

}

然后介绍查找最小值:

ElementType FindMin( BinTree BST ){
	if (BST->Left == NULL) //递归查找的结束条件
	return BST->Data;
	FindMin(BST->Left); // 根据搜索二叉树的性质左节点的数据肯定比其父节点和兄弟节点的数据大所以只需要一只寻找左节点的数据即可
}

接下来就是删除节点了,删除节点有点困难 ,原因是删除节点会有三种情况:

① 该节点的左节点和右节点 均是NULL 这是直接让该节点的父节点指向NULL即可。

②该节点有一个左节点或右节点,那么我们直接让其父节点指向该节点的子节点即可。

③最麻烦的是该节点有两个子节点。我们要在保证搜索二叉树性质的前提下把节点删除。这时我们有两种情况可以选择:一种时找到该节点左子树的最大值取代该节点然后删除左子树最大值节点,最大值节点肯定是 ① 或 ②两种情况的一种。第二种是找到该节点右子树的最小值代替该节点,然后删除右子树最小值节点。 OK,分析完毕之后 代码奉上:

BinTree Delete( BinTree BST, ElementType X ){
	if (BST->Data!=X){   //利用递归查找数据X的所在地 
		if (BST->Data>X&&BST->Left==NULL){//用两个判断来作为没有找到X时的结束语句 
			printf("Not Found!\n");
			return BST;
		}
		if (BST->Data<X&&BST->Right==NULL){
			printf("Not Found!\n");
			return BST;
		}
		if (BST->Data>X) BST->Left=Delete(BST->Left,X);
		else BST->Right=Delete(BST->Right,X);
	}
	else {
		BinTree T = BST;
		if (BST->Left==NULL&&BST->Right==NULL){   //一个if和后面的两个else if 是上文说的前两种情况。
			BST=NULL;
			free(T);
			return BST;
		}
		else if(BST->Left==NULL&&BST->Right!=NULL){
			BST = BST->Right;
			free(T);
			return BST;
		}
		else if(BST->Left!=NULL&&BST->Right==NULL){
			BST = BST->Left;
			free(T);
			return BST;
		}
		else {   //当被删除节点有左右子节点时;
			BST->Data = FindMin(BST->Right);
			BST->Right = Delete(BST->Right,BST->Data);
		}
	}
}

      以上就是今天学的搜索二叉树的知识!

点赞