二叉搜索树及其基本操作
二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
(3)它的左右子树也分别为二叉搜索树
对二叉搜索树进行中序遍历可以得到一个有序序列。
一个二叉搜索树例子 int a [] = {5,3,4,1,7,8,2,6,0,9};
二叉树搜索树的节点结构
二叉搜索树的节点内有三个变量,分别是指向左右两个孩子节点的指针和其自身的值域。
template<class T>
struct BSTNode
{
BSTNode(const T& val= T())
: left(nullptr)
, right(nullptr)
, data(val)
{
}
BSTNode<T>* left;
BSTNode<T>* right;
T data;
};
二叉搜索树的查找
若根节点不为空:
1.如果根节点的值等于查找的值,返回根节点的地址。
2.如果根节点的值大于查找的值,则在其左子树中查找。
3.如果跟姐点的值小于,则在其右子树中查找。
否则,返会空指针。
Node* Find(const T& data) //查找
{
Node* cur = root;
while (cur)
{
if (data == cur->data)
return cur;
else if (data < cur->data)
cur = cur->left;
else
cur = cur->right;
}
return nullptr;
}
二叉搜索树的插入
(1)若树为空,则直接插入,即让根节点直接指向待插入节点。
(2)若树不为空,按照二叉树搜索树性质查找插入位置,并保存其父节点位置,然后插入新节点。
在学习时,我发现实现的算法,一般都是在叶子节点的位置插入,而去插入的值不会与二叉搜索树中值重复。因此,我在想要是遇到插入的位置是非叶子节点或者插入重复值这种情况应该怎么处理。在网上查找资料发现,1