在我的博客:二叉搜索树的相关操作(递归实现)中对二叉搜索树进行了初始化、销毁以及插入、查找、删除操作!下面我将在其基础上对插入、查找、删除操作使用非递归的方式实现。
1. 按值插入
(1)空树时,直接插入在根节点
(2)非空树时:① 先找到合适的可以插入的空位置(循环找到空位置)
② 创建新节点
③ 判断将其插入在其父节点的左子树还是右子树
//思路:1.空树时,直接插入在根节点
// 2.非空树时:(1)先找到合适的可以插入的空位置
// (2)创建新节点
// (3)判断将其插入在其父节点的左子树还是右子树
void SearchTreeInsertEx(SearchNode** proot,SearchNodeType value)
{
//非法输入
if(proot==NULL)
{
return;
}
//1.空树时,直接插入在根节点
if(*proot==NULL)
{
SearchNode* new_node=CreateSearchNode(value);
*proot=new_node;
}
//2.非空树时
//当前节点
SearchNode* cur=*proot;
//当前节点的父节点
SearchNode* pre=NULL;
while(1)
{
//判断是否找到合适的位置进行插入
if(cur==NULL)
{
break;
}
//(1)先找到合适的可以插入的空位置
if(value<cur->data)
{
//当value<cur->data时,继续在其左子树中找
pre=cur;
cur=cur->lchild;
}
else if(value>cur->data)
{
//当value>cur->data时,继续在其右子树中找
pre=cur;
cur=cur->rchild;
}
else
{
//当相等时,约定插入失败
return;
}
}
//(2)创建新节点
SearchNode* new_node=CreateSearchNode(value);
//(3)判断将其插入在其父节点的左子树还是右子树
if(value<pre->data)
{
//插入在其父节点的左子树中
pre->lchild=new_node;
}
else if(value>pre->data)
{
//插入在其父节点的右子树中
pre->rchild=new_node;
}
}