二叉搜索树
什么是二叉搜索树:二叉搜索树又称之为二叉排序树,它不为空树时,它左子树上所有的元素都小于根节点的元素,而根节点右子树上所有的元素都大于根节点的元素。
二叉搜索树的基本操作:
二叉树的查找:
思路 :
非递归查找:
1.如果二叉树的根节点为空的话,直接返回0。
2.如果二叉树的该根节点不为空的话,循环下面的操作:
3 用要查找的元素与根节点的元素比较。如果要查找的元素大于根节点的元素的话,向根节点的右边查找.
4 如果要查找的元素小于根节点的元素时,向根节点的最左边查找。
5.如果要查找的元素等于根节点时,返回1。
如果循环结束时,代表此时没有找到该元素,直接返回0.
递归查找:
1.如果根节点为空的话,直接返回0;
2.如果根节点等于你要查找的元素时,返回1;
3.如果根节点大于你要查找的元素时,递归向根节点的左子树查找。
4.如果根节点小于你要查找的元素时,递归香根结点的右子树查找。
如果上面的操作全部执行完之后代表二叉搜索树中没有该元素。
//寻找数据为data的元素,找到返回1,找不到返回0
int Find(FindTree *q, DataType data)
{
FindTree *ret = q;
//当树为空时,立即返回0
if(q == NULL)
return 0;
while(q)
{
//如果找到的话,返回1;
if(data == q->data)
return 1;
//如果要查找的数据大于根节点的数据,则向右查找
else if(data > q->data)
{
q = q->right;
}
//如果要查找的数据小于根节点的数据,则向左查找
else if(data < q->data)
{
q = q->left;
}
}
//如果没有找到,返回0
return 0;
}
//递归查找
int RecursionFindTree(FindTree *q, DataType data)
{
//如果根节点为空的话,返回0
if(q == NULL)
return 0;
//如果根节点的数据等于要查找的数据时,返回1;
if(q->data == data)
return 1;
//如果根节点的数据大于要查找的数据时,向左子数查找
if(q->data > data)
return RecursionFindTree(q->left, data);
//如果根节点的数据小于要查找的数据时,向右子树查找
if(q->data < data)
return RecursionFindTree(q->right, data);
return 0;
}
二叉树的插入:
思路:
二叉搜索树插入的非递归的方法:
1.如果树为空的话,直接插入该元素。
2.如果树不为空的话,执行下面的操作:
a.设置两个指针child和parent,child用来查找要插入元素的插入的位置。parent指向child的双亲节点。
b.用child在二叉搜索树中循环查找要插入元素的位置,然后让parent指向child的双亲。如果在child的查找过程中发现有元素与你要插入的元素相同的话,直接返回0.不用插入。
c.判断要插入的位置在parent的左边还是右边。然后插入此元素。
二叉搜索树的递归插入:
1.如果根节点为空时(代表此时二叉树可能是空树,也可能找到了要插入的位置),直接插入要插入的元素。
2.如果根节点的元素等于你要插入的元素的话,代表此元素已经存在,直接返回0;
3.如果根节点的元素大于你要插入的元素时,递归的向根节点的左子树查找。
4.如果根节点的元素小于你要插入的元素时,递归的向根节点的右子树查找。
//创建一个节点
FindTree *BuyNode(DataType data)
{
FindTree *ret = (FindTree *)malloc(sizeof(FindTree));
if(ret == NULL)
{
assert(0);
}
ret->data = data;
ret->left = NULL;
ret->right = NULL;
return ret;
}
//向二叉搜索树中插入元素data
int InsertTree(FindTree **q, DataType data)
{
FindTree* cur = *q;//用来寻找要插入的位置
FindTree* parent = NULL;//用来标记要插入位置的双亲节点
//如果是空树的话,直接插入
if(*q == NULL)
{
*q = BuyNode(data);
return 1;
}
//如果不是空数的话,寻找该元素应该插入的位置
while(cur != NULL)
{
//如果数据在二叉树中已经存在的话,直接返回,插入失败
if((cur)->data == data)
return 0;
//如果要查的数据比根节点的数据小的话,向做查找,并用parent记录双亲节点
else if(cur->data < data)
{
parent = cur;
cur = cur->right;
}
//如果要查的数