树
本文梳理了一些关于数据结构中树的学习,有什么不对的地方请尽情打脸
预备知识
- 树:一些节点的集合
- 树叶:没有儿子的节点
- 路径:节点n1,n2,…,nk的一个序列,使得对于1<=i<k节点ni是ni+1的父亲
- 长:是为该路径上的边的条数,即k-1。从每一个节点到它自己有一条长为0的路径
- 深度:任意节点ni, ni的深度为根到ni的唯一路径长
- 高:ni的高是从ni到一片树叶的最长路径的长
二叉树相关性质
二叉树查找树的平均深度为O(logN)
N为节点序号,k为对应的深度, depth为平均深度,不严谨证明如下
∵
2
k
<
=
N
<
2
k
+
1
∴
k
<
=
l
o
g
2
(
N
)
<
k
+
1
∴
k
=
⌊
l
o
g
2
(
N
)
⌋
∴
d
e
p
t
h
=
∑
N
=
1
n
⌊
l
o
g
2
(
N
)
⌋
n
\begin{aligned} &∵& 2^{k}<=N<2^{k+1}\\ &∴& k<=log_2 {(N)} < k+1\\ &∴& k=\lfloor log_2 {(N)} \rfloor\\ &∴& depth= {\frac {\sum_{N=1}^{n}{\lfloor log_2 {(N)} \rfloor}}{n}} \end{aligned}
∵∴∴∴2k<=N<2k+1k<=log2(N)<k+1k=⌊log2(N)⌋depth=n∑N=1n⌊log2(N)⌋
上述式子小于
∑
N
=
1
n
l
o
g
2
(
N
)
n
<
n
l
o
g
2
(
n
)
n
=
l
o
g
2
(
n
)
\begin{aligned} & & {\frac {\sum_{N=1}^{n}{ log_2 {(N)} }}{n}}\\ &<& \frac {n log_2{(n)}}{n}\\ &=& {log_2{(n)}} \end{aligned}
<=n∑N=1nlog2(N)nnlog2(n)log2(n)
由此可见平均深度为O(logN)
N个节点的二叉树都需要N+1个null链
采用数学归纳法证明结论
当仅有一个节点时,即根节点,显然有2=1+1个null链
设存在当n=N时,存在N+1个null链
那么当n=N+1时,在原二叉树中增加了一个节点,进行了以下步骤:
- 减少一个null链
- 增加一个节点
- 该节点增加了两个null链
于是存在N+2个null链
二叉树的相关应用:表达式树
表达式树的树叶是操作数,一般为常数或者变量名
其他节点是操作符
总结
- markdown的数学公式用着实在是不习惯
- 相关内容来自《Data Structures and Algorithm Analysis in Java》第四章第1、2节
- 树方面的内容打算整理成
- 树的基本内容
- 二叉查询树的java实现
- AVL树
- 伸展树
- B树
- 看得出基本按照《Data Structures and Algorithm Analysis in Java》书中第四章的脉络进行
- 有什么不对的地方请尽情打脸