先看题目:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
我们可以分析一下,要找的是最大深度,以根节点为例,3就是根节点,深度为1,9和20都是子节点,深度为2,最后的15和7是叶子节点,深度为3。
思考一个问题:可不可以从root根节点出发,找他下一层的子树是否为叶子节点?然后依次递推,如果不是叶子节点就继续向下遍历,直到遇到叶子节点为止。每往下一层就会产生当前一层的深度。
又有一个问题,二叉树遍历会有root.left和root.right两个方向的遍历,那我们应该做什么?就是遍历完了之后求出左边和右边的最大值,这个题就做出来了。
其实这种思路有一个很有趣的地方:即最后的问题分解为了一个个的子问题。这也就是后面动态规划的思想。最后子问题求解完,我们要的问题就自然求解出来了。
上代码:
class Solution { public int maxDepth(TreeNode root) { if(root == null) { return 0; } else { int left = maxDepth(root.left); int right = maxDepth(root.right); return Math.max(left, right) + 1; } } }
最后return那里的+1其实就是每一层当前的深度+1,就是他这里本来的深度。这样,你会发现这个问题就解决了。