本篇文章是对leetcode tree和Top Interview Questions标签下12道tree类型题目的总结
Leetcode 104. Maximum Depth of Binary Tree
此题需要求一颗二叉树的最大深度,可归结于树的遍历问题
解:使用DFS,添加一个depth参数,每递归一层,depth++,并且每次求最大值
Leetcode 230. Kth Smallest Element in a BST
此题需要求一颗二叉树中第k小的结点,归结于树的遍历问题
解:
- 根据题目意思,可以从小到大遍历二叉树,那么得到便是一串从小到大的序列,第k个即为所求,所以使用中序,并使用一个数组存储,求第k个即可
- 如果使用迭代,那么可以不需要遍历整棵树
Leetcode 108. Convert Sorted Array to Binary Search Tree
此题需要将一颗有序数组转换为二叉树,属于树的构建问题
解:使用分治法,取中间的数作为根节点,然后对左右两边采取同样的操作
Leetcode 101. Symmetric Tree
此题需要求一棵树是否为对称树
解:对称问题,可以通过复制本身,然后分别从不同方向遍历来解决!
Leetcode 124. Binary Tree Maximum Path Sum
此题需要求一棵树中最大的路径和,属于求树的路径问题
解:因为对一颗树,要先得到其左子树和右子树的路径和,才能决定到底是取哪一边,因此后序遍历符合要求。
边遍历,边求最大值,最后完成本棵树的路径求和时,要将最大路径和返回给父结点,最大路径和有三种情况:左子树路径+根节点,右子树路径+根节点,根节点
116/117. Populating Next Right Pointers in Each Node I/II
此题需要将树中的同一层的所有结点连接起来,属于树的遍历问题
解:层序遍历的思想,但通过思考可以发现,当上一层的next指针连接好时,可以通过上一层的遍历连接本层的结点
Leetcode 98. Validate Binary Search Tree
此题验证一棵树是否为二叉树,属于树的遍历问题
解:
- 了确保每个结点都符合大小关系,在递归时,加上一个结点需要满足的上下界
- 一颗二叉树的中序遍历得到的序列必然是一个上升的序列,因此可以通过检查序列来检查二叉树是否合法
summary
- 就目前而言,可将树的问题分为树的遍历、树的构建和求树中路径三种问题
- 树的遍历问题的一般规律就是,根据题目中的意思,使用DFS还是BFS,使用前序、中序、后序还是层序
- 要求树中某个特定的结点,可以按照特定的遍历顺序得到所有结点数组,然后在里面查找
- 树的构造问题,一般使用分治法,只是需要不停地调整参数
- 对称问题,复制所给对象,然后从不同的方向遍历
- 树的路径问题,一般从上到下递归,然后从左边和右边中找到符合条件的那一条
- 很多树的问题需要使用树的层序遍历,并且要记录具体哪一层,那么在遍历时如何区分一层的开始/结束。1. 使用队列时,在遍历完一层的子树时,压入一个NULL结点;2. 不使用队列,使用两个指针和一个数组,即队列的模拟,另外增加一个last指针,指向每层的最后一个结点
- 在层序遍历时,可以引入dummyNode指示第一个结点!dummyNode会指示下一层的第一个结点,因为又另外声明了一个cur结点,让cur结点进行层序遍历,并提前将dummyNode赋值给cur,在cur结点遍历的时候,会自然遍历到第一个结点,此时dummyNode指向第一个结点(通过赋值的办法,使一个指针得到头结点,并且不用随另一指针遍历而被改变)