在树这一章中,我建议先学习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>}