Concepts
-
Full Binary Tree
- depth: k
- number of nodes: 2^k - 1
-
Complete Binary Tree
- heap is a complete binary tree
-
Binary Search Tree
-
Balanced Binary Search Tree / AVL Tree
- 左右两个子树的高度差的绝对值不超过1
Binary Tree 存储方式
- 链式存储: Linked List
- 顺序存储: 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2
Binary Tree Code
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
Binary Tree Traversal
- DFS
- Preorder - recursion
- Preorder - iteration Stack
- 入栈顺序:中右左
- Inorder - recursion
- Inorder - iteration Stack
- 入栈顺序:左中右
- 先访问二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点中,和右
- Postorder - recursion
- Postorder - iteration Stack
- 入栈顺序:中左右
- stack结束后,最后reverse
- BFS
- use Queue - iteration
How to choose which order traversal?
-
二叉树的构造:无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点
-
invert BT, create BT from preorder/inorder/postorder, maximum BT, merge two BT
-
BST insert node, BST delete node, BST trim, convert sorted array to BST
-
-
普通二叉树的属性:一般后序,通过递归函数的返回值做计算,比如求height;有时前序,比如求depth,比如为了方便让父节点指向子节点
-
后序:BT Lowest Common Ancestor, BST Lowest Common Ancestor (这题顺序无所谓?), BT symmetric, BT max depth, BT min depth (这里两个depth其实是height), balanced BT, 404. sum of left leaves (必须三层约束条件,才能判断是否是左叶子)
-
前序:257. BT paths (带有回溯;方便让父节点指向子节点), 112. Path Sum (带有回溯, 中要写在base case前)
-
顺序无所谓:513. find bottom left tree value(没有中间节点的处理逻辑,只要左优先就行), 112. Path Sum
-
-
二叉搜索树的属性: 中序,利用有序性
-
538. Convert BST to Greater Tree
-
Recursion
- 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值 void。
- e.g. 113. Path Sum ii
- 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。
- e.g. 236. 二叉树的最近公共祖先
- 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。
- e.g. 112 Path Sum
- e.g. 235. Binary Search Tree Lowest Common Ancestor
Binary Search Tree
- 遇到binary search tree,就要想到Inorder traversal
-
二叉搜索树是有序的。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。