
二叉树是一种很有用的表示层级关系的数据结构。形式上,一个二叉树要么是空的,要么是一个根节点r带着一个左二叉树和一个右二叉树。子树本身也是二叉树。左边的二叉树被称为根节点的左子树,右边二叉树被称为根节点的右子树。
图10.1给出了一个二叉树的图形表示。节点A是根节点。节点B和I分别是A的左右子节点。
二叉树的代码原型为:
template<typename T>
struct BinaryTreeNode {
T data;
unique_ptr<BinaryTreeNode<T>> left, right;
};
二叉树的一个关键计算就是遍历树中的所有节点。这里有一些完成这种访问的方法:
遍历左子树,访问根节点,然后再遍历右子树(中序遍历)。
图10.1的树的中序遍历是按照如下顺序访问节点的:{D, C, E, B, F, H, G, A, J, L, M, K, N, I, O, P}。
访问根节点,遍历左子树,然后再遍历右子树(前序遍历)。
图10.1的树的前序遍历是按照如下顺序访问节点的:{A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P}。
遍历左子树,遍历右子树,然后再访问根节点(后续遍历)。
图10.1的树的前序遍历是按照如下顺序访问节点的:{D, E, C, H, G, F, B, M, L, N, K, J, P, O, I, A}。
二叉树相关问题:
1. 测试一个二叉树是否为高度平衡的:
2. 测试一个二叉树是否是对称的:
3. 计算二叉树中两个节点的最低公共祖先:
4. 当节点有父节点指针时,计算LCA:
5. 计算二叉树中根节点到叶子结点之间路径的和:
6. 找到根节点到叶子结点之间的一个路径,满足路径的和为某一个给定值:
7. 不用递归的方法实现中序遍历:
8. 不用递归的方法实现前序遍历:
9. 找到中序遍历的第k个元素:
10. 计算后继:
11. 用O(1)的空间复杂度实现中序遍历:
12. 根据中序和前序遍历的数据重建一个二叉树:
13. 从前序遍历的数据和null标记中重建一个二叉树:
14. 用二叉树的叶子形成一个链表:
15. 计算一个二叉树的外沿:
16. 计算右侧的同胞树:
17. 实现二叉树的锁: