目录
🎇二叉搜索树
🎆二叉搜索树概念
我们知道树是非线性结构的,但是在二叉树知识中我们可以创建某种类型的树,对它进行~增~删·~查~改。Such as BInarySerachTree我们叫它二叉搜索树,一般及简写为BSTree。
✨character:
- 若它的 左子树不为空,则左树上的所有节点的值都小于根节点的值~
- 若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值·~
- 它的左右子树也分别二叉搜索树~
这个树长这个样子👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
我们可以通过这张图观察到它的性质·~~~
这么一颗神奇的树是怎么是实现的呢~~我们通过代码了解一下👇👇👇👇👇👇👇👇👇👇👇
🎇二叉树的实现
🎆二叉树的创建
//树的左右节点,以及节点的值~~
template <class T>
struct BinarySerachTree
{
public:
BinarySerachTree(const T& val)
:right(nullptr)
, left(nullptr)
, _val(val)
{}
BinarySerachTree<T>* left;
BinarySerachTree<T>* right;
T _val;
};
//树的根,我们也给他一个类型,方便写函数~~
template<class T>
struct BinaryTreeRoot
{
public:
typedef BinarySerachTree<T> Node;
BinaryTreeRoot()
:_root(nullptr)
{}
private:
Node*_root;
}
以上二叉树就简单的创建好了~~我们试着往里面插入一些数据吧👇👇👇👇👇👇👇👇👇👇
🎆二叉树的插入~(非递归)
我们在插入直线需要考虑两种情况
- case:1 树为空的话我们直接进行插入~~
- case:2 树不为空,进行遍历,查找左右子树~
树为空:
bool Insert(const T& val)
{
//树为空直接进行插入,然后返回~~
if (!_root)
{
_root = new Node(val);
return true;
}
}
int main()
{
BinaryTreeRoot<int> root;
int arr[] = {5,3,4,1,7,8,2,6,0,9};
for (auto e : arr)
{
root.Insert(e);
}
}
树不为空:
我们要插入4这个节点~~具体操作就是首先遍历根->左节点or右节点->找到了就new一个新节点出来然后进行插入👇👇👇👇👇👇👇👇👇👇👇👇👇👇
bool Insert(const T& val)
{
if (!_root)
{
_root = new Node(val);
return true;
}
//创建临时变量来遍历这个树·~~再遍历树的同时我们还需要记录要插入
//节点父亲的位置,来进行链接
Node* cur = _root;
Node* parent = nullptr;
//cur为空时就说明找到了合适的插入位置~~
while (cur)
{
if (val > cur->_val)
{
parent = cur;
cur = cur->right;
}
else if(val<cur->_val)
{
parent = cur;
cur = cur->left;
}
else
{
return false;
}
}
//让cur=new出来的新节点,我们需要注意的是要插入的数据大于还是
//小于父亲节点,然后决定放在左边还是右边~~
cur = new Node(val);
if (val > parent->_val)
{
parent->right = cur;
}
else
{
parent->left = cur;
}
return true;
}
🎆中序遍历
中序遍历可以让这棵树以有序的序列进行打印~~
void _Inorder(Node*root)
{
if (!root)
{
return;
}
_Inorder(root->left);
cout << root->_val << " ";
_Inorder(root->right);
}
void Inorder()
{
_Inorder(_root);
cout << endl;
}
我们之所以是要用两个函数来实现是因为,我们从外面不容易直接访问成员变量,所以定义一个子函数来进行中序遍历~~~Look👇ὄ