ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉搜索树

2022-06-25 16:33:09  阅读:170  来源: 互联网

标签:结点 right return BST 二叉 查找 搜索 else


二叉搜索树的复习(mooc)

 

//关于二叉搜索树(BST)的复习
//二叉搜索树主要用于高效查找
//结构:一棵二叉树,可以为空,不为空则满足以下性质:
//1.非空左子树的所有键值小于其根结点的键值 
//2.非空右子树的所有键值大于其根结点的键值
//3.左 右子树都是二叉搜索树
//
//
#include<bits/stdc++.h>
using namespace std;

Position Find(int x,BinTree BST)//递归查找
{
	if(!BST)return nullptr;//树可以为空
	if(x>BST->data)return Find(x,Bst->right);//比根大就继续查找右子树
	else if(x<BST->data)return Find(x,Bst->left);//比根小就继续查找左子树
	else return BST;//x==BST->data,说明找到了此树
}
//以上的递归都为尾递归,在程序的最后才进行递归,可以用循环实现
Position Find(int x,BinTree BST)//循环查找
{
	while(BST)//在循环中一直往下查找
	{
		if(x>BST->data)BST=BST->right;
		else if(x<BST->data)BST=BST->left;
		else return BST;
	}
	return nullptr;//查找失败
}
//查找的效率取决于树的高度
//最坏的情况是,n个结点,全穿在一边,每个结点都只有左儿子(或者右儿子),形成一条链
//为避免这样的情况,可以引出平衡二叉树

//查找最大元素和最小元素
//以二叉搜索树的结构来看,最大的元素一定是在最右分支的最右端结点上(一定没有右儿子)
//最小元素一定在最左分支的最左端结点上(一定没有左儿子)

Position FindMin(BinTree BST)//递归查找最小元素
{
	if(!BST)return nullptr;   //树空
	else if(!BST->left)return BST;//左子树空,则找到了最左叶结点
	else return FindMin(BST->left);//没找到就继续递归左子树继续查找
}

Position FindMax(BinTree BST)//对于最大值的查找,直接找最右叶节点即可
{
	if(BST)
		while(BST->right)BST=BST->right;
	return BST;//子树无右儿子,则说明找到最右叶结点
}

//插入,对于二叉搜索树的插入,一定要保证插入元素后,此树还是二叉搜索树(依然满足性质)
//和Find()类似,需要先找到插入的位置
//可以先从根开始,插入元素和根比较,比其小则往左查找,比其大就往右查找
Bintree insert(int x,Bintree BST)
{
	if(!BST)//原树空(或者是说递归(查找插入)的终止条件)
	{
		BST=malloc(sizeof)(struct TreeNode));//则生成且返回一个结点的二叉搜索树
		BST->data=x;
		BST->left=BST->right = nullptr;
	}
	else 
	{
		if(x<BST->data)BST->left=insert(x,BST->left);
		else if(x>BST->data)BST->right=insert(x,BST->right);
	}
	return BST;
	
}

//二叉搜索树的删除
//首先也是要查找删除的位置
//有三种情况:
//1.删除的是叶结点:直接删除,修改其父指针为NULL即可
//2.删除的结点只有一个子结点:将删除结点的父指针指向删除结点的子结点;
//3.删除的结点有两个子结点(左和右):
//有两种方法:
//1.取右子树最小元素替代删除结点
//2.取左子树中最大元素替代
//这两种做法的益处在于:
//左子树最大值(一定在左子树最右面),右子树的最小值(一定在右子树最左边)一定没有两个子结点

Bintree Delete(int x,Bintree BST)
{ 
	Position Tmp;
	if(!BST)cout << "要删除的元素未找到";//首先也要查找
	else if(x < BST->data)BST->left=Delete(x,BST->left);//从整棵树删除此结点变成从左子树删除此结点(递归)
	//继续递归的时候,可以返回NULL,即表示左子树只有一个结点并且也是待删除的结点,被free了,也可以不动,依然return BST,删除是在下面发生;
	else if(x > BST->data)BST->right=Delete(x,BST->right);//同理
	else//x==BST->data找到删除的结点
	{
		if(BST->left && BST->right)//删除的是有两孩子的结点
		{
			Tmp=FindMin(BST->right);//右子树最小值来替代
			BST->data=Tmp->data;
			BST->right=Delete(BST->data,BST->right);//在删除结点的右子树中删除最小结点
		}
		else//删除的是叶结点或者只有一个孩子的结点;
		{
			Tmp=BST;
			if(!BST->left)BST=BST->right;//只有右没有左
			else if(!BST->right)BST=BST->left;//只有左没有右
			free(Tmp);
		}
	}
	return BST;
}

参考地址:https://blog.csdn.net/LoraRae/article/details/108002861

标签:结点,right,return,BST,二叉,查找,搜索,else
来源: https://www.cnblogs.com/lxl-233/p/16411853.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有