Topic 1: 关于遍历
和树相关的第一个重要主题,是遍历。前序遍历(根,左子树,右子树),中序遍历(左子树,根,右子树),后序遍历(左子树,右子树,根),层序遍历(第一层也就是根节点所在的那层,第二层.....最后一层也就是叶节点所在的那层)是常见问题。
前序,中序,后序,使用递归都非常好些,比较困难的解法是,如何用非递归的方式来遍历。按照代码的难度升序,是前序,中序,后序。都要使用到栈这个小数据结构。相关题目如下:
Binary Tree Inorder Traversal 中序遍历
Binary Tree Preorder Traversal 前序遍历
Binary Tree Postorder Traversal 后序遍历
层序遍历和层序遍历的变种在下面的题目中,都要使用队列这个小数据结构,相关题目如下:
Binary Tree Level Order Traversal 从上向下层序遍历
Binary Tree Level Order Traversal II 从下向上层序遍历
Binary Tree Zigzag Level Order Traversal 从上向下之字形层序遍历
Flatten Binary Tree to Linked List 把二叉树转变为链表,借助前序遍历进行转换
Topic 2: 关于递归
和数相关的另外一个重要主题,是递归。其实在上面的遍历中,已经可以用递归解决不少问题了。但是接下来还有更多可以使用递归解决的问题。树本身的自相似的造型,决定了和树相关的题目是非常适合用递归的。相关题目如下:
Construct Binary Tree from Preorder and Inorder Traversal 已知前序遍历和中序遍历,建树
Construct Binary Tree from Inorder and Postorder Traversal 已知后序遍历和中序遍历,建树
Balanced Binary Tree 判断一个二叉树是否是平衡的
Symmetric Tree 判断一个二叉树是否是轴对称的,题意比较好理解,实际我觉得很容易写错的
Minimum Depth of Binary Tree 求从root到叶节点的最小深度
Validate Binary Search Tree 判断一棵树是否是二叉搜索树
Recover Binary Search Tree 修正一棵树二叉搜索树中的两个发生对调的节点,使得新树成为合格的二叉搜索树
Convert Sorted Array to Binary Search Tree 从排序数组构建二叉搜索树
Convert Sorted List to Binary Search Tree 从排序链表构建二叉搜索树
Sum Root to Leaf 通过递归计算从root到leaf的所有路径构成的数的和。
Binary Tree Maximum Path Sum 未搞定待写
Topic 3: 关于卡特兰数
这个是比较数学的问题了。看到有几道和括号相关的题目和树相关的题目,本质都是卡特兰数问题。 卡特兰数还有很多应用,wiki一下很容易发现,我理解得不太深刻,先不写了,以后想清楚了再写其它应用场合。leetcode中和卡特兰数相关的树问题如下:
Unique Binary Search Trees (1~n)可以构成多少个不同的二叉搜索树?
Unique Binary Search Trees II 把上面这些树构造出来。