1. 树基本概念:
- 根节点(root)、叶节点(leaf)、儿子(child)、父亲(parent)、兄弟(sibling)、祖父(grandparent)、孙子(grandchild)、边(edge)、路径(path)
- 路径的长(length):路径上边的条数。
- 祖先(ancestor)和后裔(descendant):存在节点a到节点b的一条路径a –> b,则a是b的祖先,b是a的后裔。
- 真祖先(proper ancestor)和真后裔(proper descendant):a != b且存在节点a到节点b的一条路径a –> b,则a是b的真祖先,b是a的真后裔。
- 节点的深度(depth):节点a的深度为从根节点到a节点的唯一路径(path)的长。根节点的深度是0。需要注意的是路径的长,不是节点的个数。
- 节点的高度(height):节点a的高度是节点a到一片树叶(只能往下看,不能回溯)的最长路径的长。所有叶节点的height都是0。同样的,定义的是路径的长,不是节点的个数。
2. 二叉树的定义及遍历
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(NULL),right(NULL) {}
};
3. 二叉树的遍历
3.1. 二叉树的前序遍历(深度优先遍历DFS)
遍历顺序:父节点 –> 左孩子 –> 右孩子
实现细节见我之前写的LeetCode题解,里面有详细解答,包括递归实现、迭代实现、线索二叉树实现。
[LeetCode]144. Binary Tree Preorder Traversal–二叉树前序遍历
3.2. 二叉树的中序遍历(深度优先遍历DFS)
遍历顺序:左孩子 –> 父节点 –> 右孩子
实现细节见我之前写的LeetCode题解
[LeetCode]94. Binary Tree Inorder Traversal–二叉树的中序遍历
3.3. 二叉树的后序遍历(深度优先遍历DFS)
遍历顺序:左孩子 –> 右孩子 –> 父节点
实现细节见我之前写的LeetCode题解
[LeetCode]145. Binary Tree Postorder Traversal–二叉树的后序遍历
3.4. 二叉树的层序遍历(宽度优先遍历WFS)
[LeetCode]102. Binary Tree Level Order Traversal–二叉树层序遍历1
[LeetCode]107. Binary Tree Level Order Traversal II–二叉树层序遍历2
[LeetCode]103. Binary Tree Zigzag Level Order Traversal–二叉树之字形遍历
3.5. 表达式树
表达式树(expression tree):表达式树的树叶是操作数(operand),比如常量或变量;其他的节点为操作符(operator)。
根据不同的遍历顺产生不同的表达式。
前缀表达式(前序遍历):++a*bc*+*defg
中缀表达式(中序遍历):a+b*c+d*e+f*g
后缀表达式(后序遍历):abc*+de*f+g*+
后缀表达式也叫逆波兰表达式。
- Evaluate Reverse Polish Notation