二叉搜索树的创建,插入,查找过程实现

基于顺序查找
数据随机:顺序查找,遍历 时间复杂度O(N)
数据已序:二分查找,时间复杂度O(log2^N)
索引顺序:数据量大,建立静态索引

基于树形查找
二叉树: 二叉搜索树,二叉平衡树
多叉树: B-树,B+树,B*树

基于哈希查找
哈希:哈希表,哈希桶,位图,布隆过滤器,

二叉搜索树(二叉排序树)
特点:
左子树不为空,则左子树上所有节点小于根节点的值
右子树不为空,则右子树上所有节点大于根节点的值
它的左右子树也为二叉搜索树
*中序遍历为递增序列

//
二叉搜索树的操作:
查找

     若根节点不为空
		如果根节点key==查找key,返回true
		如查找key<根节点key,在左子树查找
	  	如查找key>根节点key,在右子树查找

插入
在二叉搜索树中插入新元素,必须先检测该元素是否在树中已经存在 ,若存在则不进行插入操作,否则将新元素加入到搜索停止的地方

树为空,则直接插入,返回true
树不为空,按二叉搜索树性质查找插入的位置,插入新节点

删除
首先查找元素是否存在二叉搜索树中,如果不存在,返回。
若存在则删除情况如下

		a.要删除的节点无孩子节点
				直接删除该节点
		b.要删除的节点只有左孩子节点
				删除该节点,且双亲节点指向被删节点的左孩子节点
		c.要删除的节点只有右孩子节点
				删除该节点,且双亲节点指向被删节点的右孩子节点
		d.要删除的节点有左右孩子节点
				在它的右子树中寻找中序下的第一个节点(关键码最小),
				用它的值填补到被删节点中,再处理该节点的删除问题。

二叉搜索树应用

判断一个单词是否拼写正确
模拟实现一个简单的字典
log文件中有许多异常重复的IP地址,统计每个异常IP出现了多少次

二叉搜索树的基本操作

//二叉搜索树的创建
//递归算法,确定一个根节点,比根节点小的值放左边,比根节点大的值放右边。

#include<iostream>
using namespace std;


typedef struct TreeNode
{
	char data;
	struct TreeNode* lchild;
	struct TreeNode* rchild;
};

//创建  
template<class T>   //中序遍历是递增序列(检测时候使用)
TreeNode* SortBinaryTree(TreeNode* root, const T& val)
{
	if (root == NULL)
	{ 
		root = new TreeNode(val);    //根节点为空,插入,返回。
		return root;
	}
	else  
	{
		if (val <= root->data)  //小于等于根节点,递归插入左子树
		{
			root->lchild = SortBinaryTree(root->lchild, val);
		}
		else   //大于根节点,递归插入右子树
		{
			root->rchild = SortBinaryTree(root->rchild, val);
		}
	}
	return root;
}


//查找操作
template<class T>
TreeNode* find(TreeNode* root, const T&key)
{
	TreeNode* cur = root;
	while (cur != NULL&&cur->data != key)  //当查找元素不为空且与根节点不同
	{
		if (key < cur->data)    //小于根节点左子树找
		{
			cur = cur->lchild;
		}
		else   //大于根节点右子树找
		{
			cur = cur->rchild;
		}
	}
	if (cur == NULL)  //若cur=NULL则说明遍历完没有找到,
		return NULL;
	return cur;  
}

//插入节点
//类似查找,只需要查找到左子树或者右子树为空的位置插入

template<class T>
void Insert(TreeNode* root, const T& val)
{
	if (root == NULL)  //根节点为空,直接插入,返回。
	{
		root = new TreeNode(val);
		return;
	}
	TreeNode* cur = root;
	TreeNode* parent = NULL;
	bool isLeftchild = true;  //设置flag判断插入的位置在左子树还是右子树中

	while (cur != NULL) //遍历查找空位置
	{
		parent = cur; 
		if (val < cur->data)  //插入值小于根节点
		{
			cur = cur->lchild;  //在左子树中
			isLeftchild = true;
		}
		else  //插入值大于根节点
		{
			cur = cur->rchild;  //在右子树中
			isLeftchild = false;
		}  
	}
	TreeNode* new_node = new TreeNode(val);//创建新节点
	if (isLeftchild)   //根据标志位判断插入位置是否在左子树
	{
		parent->lchild=new_node;   //插入当前节点的左孩子
	}
	else
	{
		parent->rchild = new_node;  //插入当前节点的右孩子
	}
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/yu876876/article/details/84191178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞