在树这一章中,我建议先学习LISP,学会用表结构与模式匹配后,再研究树,比Java代码表达能力强多了
以下至少要能够说清楚
- 编程语言中的抽象语法树(AST)
- 通信中的Haffman编码(实现总权最小)
- Drools等规则引擎(RuleEngine)中的RETE算法(实现总叶子最小)
- 数据库中的B+Tree与LSM Tree
- 倒排索引(Inverted index)
- 文本匹配中的双数组Trie算法
- 优先队列
定义
see here https://www.wikiwand.com/en/Binary_tree#/Types_of_binary_trees
@startmindmap
skinparam shadowing false
+ Binary Tree
++ Heap
+++ Max-Heap\n t>=t.l && t>=t.r
+++ Min-Heap\n t<=t.l && t<=t.r
++++ PriorityQueue\n
++ Complete tree\n filled left to right
++ Height-balance tree\n Abs(t.l - t.r)<=1
++ Binary search tree\n t.l<=t<=t.r
@endmindmap
遍历
pre
void traverse(TreeNode root) {
<pre order code>
traverse(root.left)
traverse(root.right)
}
in
void traverse(TreeNode root) {
traverse(root.left)
<in order code>
traverse(root.right)
}
after
void traverse(TreeNode root) {
traverse(root.left)
traverse(root.right)
<after order code>}