树
![6e4700768ca9c96d117be8b9ee1e7a9f.gif](https://i-blog.csdnimg.cn/blog_migrate/c7c31992f1830ba9b15b147728bf43c2.gif)
总算把你给盼来了
现在才关注我 确实是晚了点
但没关系 来了就好
![5d59f4d65762041e329ef644ee0bac49.gif](https://i-blog.csdnimg.cn/blog_migrate/84480ded30c4c41061f8489dd8ac192a.gif)
工具:vs code 、ppt
操作系统:Linux
![a8fdfa51cf16342cd1868f4e821750b9.gif](https://i-blog.csdnimg.cn/blog_migrate/4c4741cff185ca89566a04b7d46af43d.gif)
![a8fdfa51cf16342cd1868f4e821750b9.gif](https://i-blog.csdnimg.cn/blog_migrate/4c4741cff185ca89566a04b7d46af43d.gif)
![db8bd1999416c62e346118965ccf622c.gif](https://i-blog.csdnimg.cn/blog_migrate/d85e1c8622e00f54d5ff82f905f0b4c3.gif)
![eefb00e257bb12085700bde96ac2b138.png](https://i-blog.csdnimg.cn/blog_migrate/6fd6ec9a12c62246ae214190f8a5914a.jpeg)
二叉搜索树的可视化网站:https://visualgo.net/zh/bst
1.1、定义
二叉搜索树(Binary Search Tree),也称为二叉排序树(Binary Sort tree),是指一棵空树或者具有下列性质的二叉树:
◆ 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; ◆ 若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值; ◆ 任意节点的左、右子树也分别为二叉查找树;1.2、说明
1.二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。
2.二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。
3.二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以透过建构一棵二叉查找树变成一个有序序列,建构树的过程即为对无序序列进行查找的过程。
4.每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。
5.搜索、插入、删除的复杂度等于树的高度,期望O(log n),最坏O(n)(数列有序,树退化成线性表)。
6.虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为O(log n),从而将最坏效率降至O(log n),如AVL树、红黑树等。
![31e70687df697f5ffc22afdff3b87e2b.gif](https://i-blog.csdnimg.cn/blog_migrate/df4855578a1cdc112421b6cd9af7ca27.gif)
![1b390e2dd1d56204bc17d24f3fa75bad.gif](https://i-blog.csdnimg.cn/blog_migrate/4d7ca918dc71a7cd2826be9fa62a7b10.gif)
![a5439d2b1c933611c7f8d102ab6ac27b.gif](https://i-blog.csdnimg.cn/blog_migrate/18cce6a595b4dfcbb32825943759fb6d.gif)
2.二叉搜索树的实现(递归)
二叉树的存储结构——链式存储
以c++的形式实现二叉树的存储结构——链式存储(二叉链表)。
结构:
2.1、前序遍历构造二叉树(迭代)
说明:
先序遍历构建二叉树,其每个节点都满足以下规则:
1.对于 root->left 的任何后代,值总 < root->val;
2.而 root->right 的任何后代,值总 >root->val;
3.此外,先序遍历首先显示节点的值,然后遍历root->left,接着遍历root->right。
——《力扣》
详细解释:力扣1008题
▲
▼
2.2、二叉搜索树的插入操作(迭代)
说明:
1.若 root != nullptr,进行插入操作。
2.若 val > root->val,插入到右子树。
3.若 val < root->val,插入到左子树。
4.返回 root。
要满足二叉搜索树的规则进行插入操作。
复杂度分析
时间复杂度:O(H),其中 H 指的是树的高度。平均情况下 O(log N),最坏的情况下 O(N)。
空间复杂度:O(1)。
详细解释:力扣701题
▲
▼
2.3、二叉搜索树的删除操作
说明:
进行删除操作时有以下几种情况:
1.没有左右子节点,即叶子结点可以直接删除。
2.存在左节点或者右节点,删除后需要对子节点移动。
3.同时存在左右子节点,不能简单的删除,但是可以通过和后继节点交换后转换为前两种情况。
要满足二叉搜索树的规则进行删除操作。
时间复杂度:0(log N)。在算法的执行过程中,我们一直在树上向左或向右移动。首先先用O(H)的时间找到要删除的节点,然后删除节点需要 O(H)的时间(H指的是树的要删除节点位置的高度) 。
空间复杂度:O(H)。递归时堆栈使用的空间,H是树的高度。
详细解释:力扣450题
▲
▼
2.4、二叉搜索树的搜索操作(迭代)
说明:
1.当根节点不空 root != nullptr且根节点不是目的节点 val != root->val:
如果 root->val>val,进入根节点的左子树查找 root = root->left。
如果 root->valright。
2. 返回 root。
要满足二叉搜索树的规则进行搜索操作。
复杂度分析
时间复杂度:O(H),其中 H 是树高。平均时间复杂度:O(logN),最坏时间复杂度为O(N)。
空间复杂度:O(1),恒定的额外空间。
详细解释:力扣700题
▲
▼
![0a4d68f929df275649e0f0b097560f5b.gif](https://i-blog.csdnimg.cn/blog_migrate/fb2057f05f46f47c9932a08bba624c3b.gif)
3.1、二叉搜索树的前序遍历操作
首先遍历根 , 再访问左子树,最后遍历右子树。3.2、二叉搜索树的中序遍历操作
首先遍历左子树,再访问根,最后遍历右子树。3.3、二叉搜索树的后序遍历操作
首先遍历左子树,再访问右子树,最后遍历根。3.4、二叉搜索树的层序遍历操作
3.3、main()调用
以上的代码是以迭代的形式来写。是以“力扣【https://leetcode-cn.com/】”为模型,实现迭代版二叉搜索树。
![3703eb45a9deea04db1ca0b8b1afb8c5.gif](https://i-blog.csdnimg.cn/blog_migrate/10ae3a8b2d6d62e735c038a42a5a96e2.gif)
《栈c++》
《队列c++》
《树与二叉树递归版c++》
《树与二叉树迭代版c++》
《二叉搜索树递归版c++》
侵删致歉
![fca0705fa81ea99682dfb472c7ddac25.gif](https://i-blog.csdnimg.cn/blog_migrate/b4df2ddc571470a5d3bcbd4aaedbe84e.gif)
转载需经同意并引用出处
![1c4dcfb2b93dbcb88cc144a0471e67df.gif](https://i-blog.csdnimg.cn/blog_migrate/d6a223f99327f0f6b051120712672a5e.gif)