二叉查找树——树的学习(3)

二叉查找树的相关概念

  • 使二叉树变为二叉查找树的性质是:**对于树中的每个节点X,他的左子树中所有关键字都小于该节点关键值,对于右子树中所有关键字值都大于该节点的关键值
  • 二叉查找树的平均深度为O(logN)
  • 二叉查找树的节点定义与二叉树的节点定义相同:
struct TreeNode{
   ElementType Element;
   TreeNode* Left;
   TreeNode* Right;
}

二叉树的相关操作

  • 建立一棵空的二叉搜索树
TreeNode* MakeEmpty(TreeNode* T){
	if(T!=NULL){
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
  • 二叉查找树的Find操作
    这个操作一般需要返回指向树T中具有关键字X的节点的指针,如果这样的节点不存在,那么返回NULL,
TreeNode* Find(TreeNode* T,int X){
	if(T==NULL)
		return NULL;
	if(X<T->Element)
		return Find(T->Left,X);
	else if(X>T->Element)
		return Find(T->Right,X);
	else
		return T;
  • FindMin操作
TreeNode*FindMin(TreeNode* T) {
	if (T == NULL)
		return NULL;
	else if (T->Left == NULL)
		return T;
	else
		return FindMin(T->Left);
} 
  • FindMax操作
TreeNode*FindMax(TreeNode* T) {
	if (T == NULL)
		return NULL;
	else if (T->Right == NULL)
		return T;
	else
		return FindMax(T->Right);
} 
  • 插入操作
TreeNode*Insert(int X, TreeNode* T) {
	if (T == NULL) {
		T = new TreeNode;
		T->element = X;
		T->Left = NULL;
		T->Right = NULL;
		return T;
	}
	else if(X<T->Left->element) {
		/*return Insert(X, T->Left);*/
		T->Left = Insert(X, T->Left);
	}
	else if(X>T->element){
		/*return Insert(X, T->Right);*/
		T->Right = Insert(X, T->Right);
	}
	return T;
}
  • 删除操作
    删除操作分为几种情况讨论:
    (1)要删除的是叶节点:直接删除即可
    (2)要删除的节点只有一个儿子:将指针绕过父节点,然后删除
    (3)要删除的节点有两个儿子:用该节点右子树中最小的节点补上
TreeNode*Delete(int X, TreeNode* T) {
	TreeNode* P;
	if (T == NULL)
		return NULL;
	else if (X < T->element) 
		T->Left = Delete(X, T->Left);
	else if (X > T->element)
		T->Right = Delete(X, T->Right);
	//对所删除的节点三种情况的处理
	else if (T->Left && T->Right) {
		P = FindMin(T->Right);
		T->element = P->element;
		T->Right = Delete(T->element, T->Right);
	}
	else {
		P = T;
		if (T->Left == NULL)
			T = T->Right;
		else if (T->Right == NULL)
			T = T->Left;
		delete T;
	}
	return T;
}
发布了37 篇原创文章 · 获赞 0 · 访问量 564

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104183382