数据结构之二叉搜索树

103 阅读2分钟

一:定义

  二叉搜索树也称为二叉排序树和二叉查找树(BST)
   二叉搜索树:一颗二叉树,可以为空,也可以不为空,满足以下性质
  1. 非空左子树的所有键值小于其根节点的键值。

  2. 非空右子树的所有键值大于其根节点的键值。

  3. 左、右子树都是二叉搜索树,且根节点不重合。

二:基本操作

查找

  • 查找最大值:查找最左边即为最大值。
  • 查找最小值:查找最右边即为最小值。

插入

      注意:不能插入一样的节点

删除【比较麻烦】

      若删除该节点是叶子节点,则直接删除,并再修改其父节点指针---置为NULL

      若删除该节点是带有一个儿子节点,则将其父节点的指针指向要删除结点的孩子结点

      若删除该节点是带有左右二个二叉树,则用一个结点替代被删除结点:右子树的最小元素 或者 左子树最大元素。

三:代码

#include<stdio.h>#include<stdlib.h>typedef struct TreeNode* SearchTree;typedef struct TreeNode* Position;struct TreeNode{	int data;	SearchTree Left, Right;};SearchTree MakeEmpty(SearchTree T){	if (T!= NULL)	{		MakeEmpty(T->Left);		MakeEmpty(T->Right);		free(T);	}	return NULL;}SearchTree Find(int x, SearchTree T){	if (T == NULL) return NULL;	if (T->data < x)	{		return Find(x, T->Right);	}	else if (T->data > x)	{		return Find(x, T->Left);	}	else	{		return T;	}}Position FindMin(SearchTree T){	if (T == NULL) return NULL;	else if (T->Left == NULL) { return T; }	else	{		return FindMin(T->Left);	}}Position FindMax(SearchTree T){	if (T == NULL) return NULL;	else if (T->Right == NULL)	{		return T;	}	else	{		return FindMax(T->Right);	}}SearchTree Insert(SearchTree T, int X){	if (T == NULL)	{		T = (SearchTree)malloc(sizeof(struct TreeNode));		T->data = X;		T->Left = T->Right = NULL;	}	else if (T->data > X)	{		T->Left = Insert(T->Left, X);	}	else if (T->data < X)	{		T->Right = Insert(T->Right, X);	}	return T;}SearchTree Delete(SearchTree T, int X){	Position TmpCell;	if (T == NULL)	{		return NULL;	}	else if (T->data > X)	{		T->Left = Delete(T->Left, X);	}	else if (T->data < X)	{		T->Right = Delete(T->Right, X);	}	else if (T->Left != NULL && T->Right != NULL)	{		TmpCell = FindMin(T->Right);		T->data = TmpCell->data;		T->Right = Delete(T->Right, T->data);	}	else	{		TmpCell = T;		if (T->Left == NULL)		{			T = T->Right;		}		else if (T->Right == NULL)		{			T = T->Left;		}		free(TmpCell);	}	return T;}void InOrderTraversal(SearchTree T){	if (T)	{		InOrderTraversal(T->Left);		printf("%5d", T->data);		InOrderTraversal(T->Right);	}	//("\n");}