《画解数据结构》三十张彩图,画解二叉搜索树_二叉搜索树程序流图(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

i

(

i

1

)

i (i \ge 1)

i(i≥1) 层上至多有

2

i

1

2^{i-1}

2i−1 个结点。

既然是至多,就只需要考虑满二叉树的情况,对于满二叉树而言,当前层的结点数是上一层的两倍,第一层的结点数为 1,所以第

i

i

i 的结点数可以通过等比数列公式计算出来,为

2

i

1

2^{i-1}

2i−1。

2)性质2

【性质2】深度为

h

h

h 的二叉树至多有

2

h

1

2^{h}-1

2h−1 个结点。

对于任意一个深度为

h

h

h 的二叉树,满二叉树的结点数一定是最多的,所以我们可以拿满二叉树进行计算,它的每一层的结点数为

1

1

1、

2

2

2、

4

4

4、

8

8

8、…、

2

h

1

2^{h-1}

2h−1。
  利用等比数列求和公式,得到总的结点数为:

1

2

4

.

.

.

2

h

1

=

2

h

1

1 + 2 + 4 + … + 2^{h-1} = 2^h - 1

1+2+4+…+2h−1=2h−1

3)性质3

【性质3】对于任意一棵二叉树

T

T

T,如果叶子结点数为

x

0

x_0

x0​,度为 2 的结点数为

x

2

x_2

x2​,则

x

0

=

x

2

1

x_0 = x_2 + 1

x0​=x2​+1

x

1

x_1

x1​ 代表度 为 1 的结点数,总的结点数为

n

n

n,则有:

n

=

x

0

x

1

x

2

n = x_0 + x_1 + x_2

n=x0​+x1​+x2​
  任意一个结点到它孩子结点的连线我们称为这棵树的一条边,对于任意一个非空树而言,边数等于结点数减一,令边数为

e

e

e,则有:

e

=

n

1

e = n-1

e=n−1

对于度为 1 的结点,可以提供 1 条边,如图中的黄色结点;对于度为 2 的结点,可以提供 2 条边,如图中的红色结点。所以边数又可以通过度为 1 和 2 的结点数计算得出:

e

=

x

1

2

x

2

e = x_1 + 2 x_2

e=x1​+2x2​  联立上述三个等式,得到:

e

=

n

1

=

x

0

x

1

x

2

1

=

x

1

2

x

2

e = n-1 = x_0+x_1+x_2 - 1 = x_1 + 2 x_2

e=n−1=x0​+x1​+x2​−1=x1​+2x2​  化简后,得证:

x

0

=

x

2

1

x_0 = x_2 + 1

x0​=x2​+1

4)性质4

【性质4】具有

n

n

n 个结点的完全二叉树的深度为

l

o

g

2

n

1

\lfloor log_2n \rfloor + 1

⌊log2​n⌋+1。

由【性质2】可得,深度为

h

h

h 的二叉树至多有

2

h

1

2^{h}-1

2h−1 个结点。所以,假设一棵树的深度为

h

h

h,它的结点数为

n

n

n,则必然满足:

n

2

h

1

n \le 2^{h}-1

n≤2h−1  由于是完全二叉树,它一定比深度为

h

1

h-1

h−1 的结点数要多,即:

2

h

1

1

<

n

2^{h-1}-1 \lt n

2h−1−1<n  将上述两个不等式,稍加整理,得到:

2

h

1

n

<

2

h

2^{h-1} \le n \lt 2^h

2h−1≤n<2h  然后,对不等式两边取以2为底的对数,得到:

h

1

l

o

g

2

n

<

h

h-1 \le log_2n \lt h

h−1≤log2​n<h  这里,由于

h

h

h 一定是整数,所以有:

h

=

l

o

g

2

n

1

h = \lfloor log_2n \rfloor + 1

h=⌊log2​n⌋+1

二、二叉树的存储

1、顺序表存储

二叉树的顺序存储就是指利用数组对二叉树进行存储。结点的存储位置即数组下标,能够体现结点之间的逻辑关系,比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等等。

1)完全二叉树

来看一棵完全二叉树,我们对它进行如下存储。

编号代表了数组下标的绝对位置,映射后如下:

下标0123456789101112

d

a

t

a

data

data |

− |

a

a

a |

b

b

b |

c

c

c |

d

d

d |

e

e

e |

f

f

f |

g

g

g |

h

h

h |

i

i

i |

j

j

j |

k

k

k |

l

l

l |
|   这里为了方便,我们把数组下标为 0 的位置给留空了。这样一来,当知道某个结点的下标

x

x

x,就可以知道它左右儿子的下标分别为

2

x

2x

2x 和

2

x

1

2x+1

2x+1;反之,当知道某个结点的下标

x

x

x,也能知道它父结点的下标为

x

2

\lfloor \frac x 2 \rfloor

⌊2x​⌋。 | | | | | | | | | | | | | |

2)非完全二叉树

对于非完全二叉树,只需要将对应不存在的结点设置为空即可。

  编号代表了数组下标的绝对位置,映射后如下:

下标0123456789101112

d

a

t

a

data

data |

− |

a

a

a |

b

b

b |

c

c

c |

d

d

d |

e

e

e |

f

f

f |

g

g

g |

− |

− |

− |

k

k

k |

l

l

l |

3)稀疏二叉树

对于较为稀疏的二叉树,就会有如下情况出现,这时候如果用这种方式进行存储,就比较浪费内存了。

  编号代表了数组下标的绝对位置,映射后如下:

下标0123456789101112

d

a

t

a

data

data |

− |

a

a

a |

b

b

b |

c

c

c |

d

d

d |

− |

− |

g

g

g |

h

h

h |

− |

− |

− |

− |
|   于是,我们可以采取链表进行存储。 | | | | | | | | | | | | | |

2、链表存储

二叉树每个结点至多有两个孩子结点,所以对于每个结点,设置一个 数据域 和 两个 指针域 即可,指针域 分别指向 左孩子结点 和 右孩子结点。

typedef struct TreeNode {
    DataType data;
    struct TreeNode \*left;   // (1)
    struct TreeNode \*right;  // (2)
}TreeNode;

  • (

1

)

(1)

(1) left指向左孩子结点;

  • (

2

)

(2)

(2) right指向右孩子结点;

三、二叉树的遍历

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点访问一次且仅被访问一次。
  对于线性表的遍历,要么从头到尾,要么从尾到头,遍历方式较为单纯,但是树不一样,它的每个结点都有可能有两个孩子结点,所以遍历的顺序面临着不同的选择。
  二叉树的常用遍历方法有以下四种:前序遍历、中序遍历、后序遍历、层序遍历。
  我们用 void visit(TreeNode *root)这个函数代表访问某个结点,这里为了简化问题,访问结点的过程就是打印对应数据域的过程。如下代码所示:

void visit(TreeNode \*root) {
    printf("%c", root->data);
}

1、 前序遍历

1)算法描述

【前序遍历】如果二叉树为空,则直接返回。否则,先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。

  前序遍历的结果如下:

a

b

d

g

h

c

e

f

i

abdghcefi

abdghcefi。

2)源码详解
void preorder(TreeNode \*root) {
    if(root == NULL) {
        return ;            // (1)
    }
    visit(root);            // (2)
    preorder(root->left);   // (3)
    preorder(root->right);  // (4)
}

  • (

1

)

(1)

(1) 待访问结点为空时,直接返回;

  • (

2

)

(2)

(2) 先访问当前树的根;

  • (

3

)

(3)

(3) 再前序遍历左子树;

  • (

4

)

(4)

(4) 最后前序遍历右子树;

2、 中序遍历

1)算法描述

【中序遍历】如果二叉树为空,则直接返回。否则,先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。
在这里插入图片描述
  中序遍历的结果如下:

g

d

h

b

a

e

c

i

f

gdhbaecif

gdhbaecif。

2)源码详解
void inorder(TreeNode \*root) {
    if(root == NULL) {
        return ;            // (1)
    }
    inorder(root->left);    // (2)
    visit(root);            // (3)
    inorder(root->right);   // (4)
}

  • (

1

)

(1)

(1) 待访问结点为空时,直接返回;

  • (

2

)

(2)

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • (

2

)

(2)

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-pYyThoCU-1713443341532)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值