解题思路(递归):
终止条件: 若节点为空,返回深度0。递归步骤: 分别计算左子树和右子树的最大深度,取较大者并加1(当前节点)。
Java代码:
class Solution { public int maxDepth ( TreeNode root) { if ( root == null ) return 0 ; return Math . max ( maxDepth ( root. left) + 1 , maxDepth ( root. right) + 1 ) ; }
}
复杂度分析:
时间复杂度: O(n), 需访问每个节点一次。空间复杂度: 递归调用栈的深度取决于树的高度 h,最坏情况(树为链表)空间复杂度为 O(n),平衡树时为 O(log n)。
解题思路(BFS):
层次遍历: 逐层处理节点,每处理一层深度加1。若节点为空,返回深度0。队列实现: 利用队列存储当前层所有节点,循环处理直至队列为空。
Java代码:
class Solution { public int maxDepth ( TreeNode root) { if ( root == null ) return 0 ; Queue < TreeNode > queue = new LinkedList < > ( ) ; queue. offer ( root) ; int depth = 0 ; while ( ! queue. isEmpty ( ) ) { depth++ ; int levelSize = queue. size ( ) ; for ( int i = 0 ; i < levelSize; i++ ) { TreeNode node = queue. poll ( ) ; if ( node. left != null ) queue. offer ( node. left) ; if ( node. right != null ) queue. offer ( node. right) ; } } return depth; }
}
复杂度分析:
时间复杂度: O(n), 需访问每个节点一次。空间复杂度: 队列最多存储一层节点,最坏情况(完全二叉树)空间复杂度为 O(n)。
解题思路(递归):
终止条件: 当前节点为空时返回 null,当前节点没有子树时返回当前节点。递归步骤: 递归翻转左子树和右子树,然后交换当前节点的左子节点和右子节点。
Java代码:
class Solution { public TreeNode invertTree ( TreeNode root) { if ( root == null ) return null ; if ( root. left == null && root. right == null ) return root; TreeNode left = invertTree ( root. left) ; TreeNode right = invertTree ( root. right) ; root. left = right; root. right = left; return root; }
}
复杂度分析:
时间复杂度: O(n),需访问每个节点一次。空间复杂度: 递归调用栈的深度为树的高度 h,最坏情况(链状树)空间复杂度为 O(n)。