pta 是否完全二叉搜索树_二叉搜索树递归版c++

a77e879a532de8b127894543f16d76d2.gif

1.什么是二叉搜索树?
二叉搜索树
(Binary Search Tree),也称为二叉排序树(Binary Sort tree),是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
053e25bb508a1f80570f1f84bec5c8d0.png

2.说明

1.二叉查找树相比于其他数据结构的优势在于查找插入的时间复杂度较低。为O(log n)

2.二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

3.二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以透过建构一棵二叉查找树变成一个有序序列,建构树的过程即为对无序序列进行查找的过程。

4.每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。

5.搜索、插入、删除的复杂度等于树的高度,期望O(log n),最坏O(n)(数列有序,树退化成线性表)。

6.虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为O(log n),从而将最坏效率降至O(log n),如AVL树、红黑树等。


二叉搜索树递归版的实现

5b48bae38dad63743ae38a40faf79719.png

下面将会实现TreeNode.h、TreeCreate.h、recursion.h以及Traversal_recursion.h文件。剩下的将会在二叉搜索树迭代版中实现。

1.二叉树的链式存储(TreeNode.h)

f0d0dbc8d0d26b047e8c3c4541d72761.png

2.二叉树的创建文件(TreeCreate.h)

24817af9a59b41f9c944c85915e04a1a.png

3.二叉搜索树递归文件(recursion.h)

89c2d0c5255058147c6f4ce2b740a6a5.png

3.1、前序遍历构造二叉搜索树(递归)

说明:前序遍历构建二叉树,其每个节点都满足以下规则:1.对于 root->left 的任何后代,值总 < root->val;2.而 root->right 的任何后代,值总 >root->val;3.此外,先序遍历首先显示节点的值,然后遍历root->left,接着遍历root->right。

结合二叉搜索树的性质及二叉搜索树的插入操作构成前序遍历构建二叉树

b7ac1533427d897d7426b419b33bde0c.png

3.2、二叉搜索树的插入操作(递归)

说明:1.若 root == nullptr,则返回 TreeNode(val)。2.若 val > root->val,插入到右子树。3.若 val < root->val,插入到左子树。4.返回 root。
fe87530c5b121348a4c7aebbc00cfa64.gif

要满足二叉搜索树的性质进行插入操作。

308bda9562cb5dedac300fef78253e92.png

3.2、二叉搜索树的查找操作(递归)

说明:1.若根节点为空 root == nullptr ,返回nullptr。2.若根节点的值等于搜索值 val == root->val,返回根节点。3.若val val,进入根节点的左子树递归查找 searchBST(root->left, val)4.若val> root->val,进入根节点的右子树递归查找searchBST(root->right, val)。5.返回根节点。
053a8b2bf7ba2a3da0b405d9e77a13e7.gif

要满足二叉搜索树的规则进行搜索操作。

c76ffb1aca6764a0ec033add46987e86.png

3.3、二叉搜索树的删除操作

说明:进行删除操作时有以下几种情况:1.没有左右子节点,即叶子结点可以直接删除。2.存在左节点或者右节点,删除后需要对子节点移动。3.同时存在左右子节点,不能简单的删除,但是可以通过和后继节点交换后转换为前两种情况。
c7df8def987a645b120dfe8815bea343.png
2e973eb345c868a787cdcbf40c1ec22d.gif

存在左节点或者右节点,删除后需要对子节点移动

要满足二叉搜索树的规则进行删除操作。

279341c9252198d1a5229a0d9db7c650.png

4.二叉搜索树的遍历Traversal_recursion.h

7c28c70101f715aad3a0c2f3bc706e5e.png
①前序遍历:先遍历这个节点,然后再遍历它的左子树,最后遍历它的右子树。②中序遍历:先遍历它的左子树,然后再遍历它的本身,最后遍历它的右子树。③后序遍历:先遍历它的左子树,然后再遍历它的右子树,最后遍历它本身。
ec64992509acf96a7bb7657346106f19.png
37c070358e1741de40234fd8d7d3dc1e.png

二叉搜索树的中序遍历是一个升序遍历

5.二叉树的最大深度(递归)

左子树和右子树的最大深度 left 和 right,那么该二叉树的最大深度即为max(left,right) + 1
72eabfcd7f001f8fe6c0e37df1ef81e0.png

以上的代码是以递归的形式来写。后面会以“力扣”为模型,(重点)实现迭代版二叉搜索树。

代码:

https://gitee.com/yaoshanxia/data-structure-and-algorithm/tree/master/Tree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值