关于学习二叉搜索树的心得体会
来源:互联网 发布:directx for windows 编辑:程序博客网 时间:2024/06/07 02:53
首先,二叉搜索树是建立在此树是一棵中序遍历的二叉树的前提下的,基本原理也就是先将关键值与根节点进行比较,如果比根节点的data值小,就在此树的左树中去寻找,如果比根节点的data值大,就在该树的右子树中去找,当然,如果关键值和根节点的data值相等,就是找到了。实际上就是一个简单的递归调用。需要注意的是,同样一组数据,选择不同的树做根结点,所建立的二叉搜索树结果是不同的。
BSTNode<Type>* Search(BSTNode<Type> *t, const Type &key)const
{
if(t == NULL)
return NULL;
if(t->data == key)
return t;
else if(key < t->data)
Search(t->leftChild, key);
else
Search(t->rightChild, key);
}
其实二叉搜索树的其他性质基本都是在像这样循环调用。下面将简单列举几个:
(1).二叉树的插入。
1.第一步,搜索要插入的值在二叉树中是否已经存在,如果存在,则不需要插入,直接返回就好。如果不存在,在进行插入。
2.插入时,要根据值去插入,保证它在插入之后的大小顺序,逐层遍历,如果比根节点的值小在根节点的左子树中去寻找合适位置,如果比根节点的值大就去右子树中寻找合适位置插入,始终保证左结点比根节点小,右子树比根节点大。
bool Insert(BSTNode<Type> *&t, const Type &x)
{
if(t == NULL)
{
t = new BSTNode<Type>(x);
return true;
}
else if(x < t->data)
Insert(t->leftChild, x);
else if(x > t->data)
Insert(t->rightChild, x);
else
return false;
}
(2).二叉搜索树结点的删除。
关于结点删除有三种分类
1.该节点没有孩子结点,直接删除。
2.该节点有左孩子或者有后孩子,删除该节点后让孩子结点顶替自身位置,与上层树进行连接。
3.该节点既有左孩子又有后孩子,删除后就要考虑那个结点要顶替自身位置,与上层树连接的问题。
如果是左子树顶替,就在左子树中找到最大值去頂位,如果是右子树,就在右子树中找到最小的去顶替。
以上三种情况,同样采用的是递归调用。
bool Remove(BSTNode<Type> *&t, const Type &key)
{
if(t == NULL)
return false;
if(key < t->data)
Remove(t->leftChild, key);
else if(key > t->data)
Remove(t->rightChild, key);
else
{
if(t->leftChild==NULL && t->rightChild==NULL)
{
delete t;
t = NULL;
}
else if(t->leftChild!=NULL && t->rightChild==NULL)
{
BSTNode<Type> *p = t;
t = p->leftChild;
delete p;
}
else if(t->leftChild==NULL && t->rightChild!=NULL)
{
BSTNode<Type> *p = t;
t = p->rightChild;
delete p;
}
else
{
BSTNode<Type> *p = t->rightChild;
while(p->leftChild != NULL)
p = p->leftChild;
t->data = p->data;
Remove(t->rightChild, p->data);
}
return true;
}
}
其余的求最大,最小,置空就不一一写了,欢迎指教,技术菜鸟而已,不要太暴躁,我这人经不起批评
- 关于学习二叉搜索树的心得体会
- 关于语言学习的心得体会
- 关于学习Java的心得体会
- 关于学习linux的一些心得体会
- 关于二叉搜索树的一些操作
- 二叉搜索树学习
- 关于链接的心得体会
- java 关于二叉搜索树,平衡二叉树,b树,二叉堆的几段代码
- 关于framebuffer这几天学习的一点心得体会和疑惑
- Eclipse学习的心得体会:
- 学习JAVA的心得体会
- 学习单片机的心得体会
- 学习C++的心得体会
- 学习Ios的心得体会
- 学习vb的心得体会
- 阶段性学习的心得体会
- 学习Git的心得体会
- 学习spss的心得体会
- Laravel 实战视频教程(精品)
- Android Input Framework-InputReader&InputDispatcher
- 一款微信小程序项目的开发过程全解析
- java execute、executeQuery和executeUpdate之间的区别
- java对象的强引用,软引用,弱引用和虚引用
- 关于学习二叉搜索树的心得体会
- 微信小程序之https步骤一
- 《Intent相关的工具类》
- MySQL不能启动 Can't start server : Bind on unix socket: Permission denied
- 均匀分布(uniform distribution)期望的最大似然估计(maximum likelihood estimation)
- webpack构建React应用二:webpack的安装及基础使用
- jeecg {"empty":false,"reference":true,"viewName":"org/jeecgframework/web/crm/haTSubscription/messag
- [线段树][矩乘][DP]Codeforces Round 573D && RussianCodeCup Thanks-Round .Bear and Cavalry
- CDialog中创建CView窗口