js遍历树节点下的所有子节点_二叉搜索树迭代版c++

6e4700768ca9c96d117be8b9ee1e7a9f.gif

总算把你给盼来了

现在才关注我 确实是晚了点

但没关系 来了就好

5d59f4d65762041e329ef644ee0bac49.gif

工具:vs code 、ppt

操作系统:Linux

a8fdfa51cf16342cd1868f4e821750b9.gif a8fdfa51cf16342cd1868f4e821750b9.gif db8bd1999416c62e346118965ccf622c.gifSUMMER

9f74b9aa83beb164940189ac74b33732.gif

114f4f4e26b6f7bd2ef1922bdee9e44b.png

eefb00e257bb12085700bde96ac2b138.png

2b80f6b75f72a902260d4aada9ea324c.png

二叉搜索树的可视化网站: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 1b390e2dd1d56204bc17d24f3fa75bad.gif a5439d2b1c933611c7f8d102ab6ac27b.gif

2.二叉搜索树的实现(递归)

二叉树的存储结构——链式存储

以c++的形式实现二叉树的存储结构——链式存储(二叉链表)

105e6fd1e33408ac7c5e5f73f69e1425.png

结构:

fc665a791a6a2f4173083af0bf2334f9.png


2.1、前序遍历构造二叉树(迭代)

说明:

先序遍历构建二叉树,其每个节点都满足以下规则:

1.对于 root->left 的任何后代,值总 < root->val;

2.而 root->right 的任何后代,值总 >root->val;

3.此外,先序遍历首先显示节点的值,然后遍历root->left,接着遍历root->right。

                                                                     ——《力扣》

5e2c4621e0dc0c327ba99c611cd10c1e.png

详细解释:力扣1008题



2.2、二叉搜索树的插入操作(迭代)

说明:

1.若 root != nullptr,进行插入操作。

2.若 val > root->val,插入到右子树。

3.若 val < root->val,插入到左子树。

4.返回 root。

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

d5f5ce1469a839bd39e1245b26e14b1c.png

复杂度分析

时间复杂度:O(H),其中 H 指的是树的高度。平均情况下 O(log N),最坏的情况下 O(N)。

空间复杂度:O(1)。

详细解释:力扣701题



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

说明:

进行删除操作时有以下几种情况:

1.没有左右子节点,即叶子结点可以直接删除。

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

3.同时存在左右子节点,不能简单的删除,但是可以通过和后继节点交换后转换为前两种情况。

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

3463eea44caa45074bdeaa13254cd6fb.png

复杂度分析

时间复杂度: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。

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

642afe7f265ba1394a7aa8b96443ce50.png

复杂度分析

时间复杂度:O(H),其中 H 是树高。平均时间复杂度:O(logN),最坏时间复杂度为O(N)。

空间复杂度:O(1),恒定的额外空间。

详细解释:力扣700题



0a4d68f929df275649e0f0b097560f5b.gif

3.1、二叉搜索树的前序遍历操作

首先遍历 访问左子树,最后遍历右子树。

6185b771222074094b7727bb6f09545e.png

3.2、二叉搜索树的中序遍历操作

首先遍历左子树,再访问,最后遍历右子树。

7930f97bad9b586c8fd68865943bd54c.png

3.3、二叉搜索树的后序遍历操作

首先遍历左子树,再访问右子树,最后遍历

d6d9f20a3f1dee711c62809c5a3276a6.png

3.4、二叉搜索树的层序遍历操作

5a224bc2dea454fe5f282d814d8c446a.png

3.3、main()调用

79180f6a50882c44b6184289e58a63f2.png

 以上的代码是以迭代的形式来写。是以“力扣【https://leetcode-cn.com/】”为模型,实现迭代版二叉搜索树。

3703eb45a9deea04db1ca0b8b1afb8c5.gif

《栈c++》

《队列c++》

《树与二叉树递归版c++》

《树与二叉树迭代版c++》

《二叉搜索树递归版c++》

518ecb125e82cf378da3bf967aa5cc70.png

36be52feaa754d8d707b98a3a5e147c9.gif

部分图片来源网络

侵删致歉

fca0705fa81ea99682dfb472c7ddac25.gif

转载需经同意并引用出处

1c4dcfb2b93dbcb88cc144a0471e67df.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值