解题思路:
初始化: 创建一个结果列表和一个队列,将根节点入队。循环处理: 当队列不为空时,记录当前层节点数 size,依次处理这些节点:
出队当前节点,将其值加入临时列表。 若存在左子节点,入队。 若存在右子节点,入队。
返回结果: 内层循环结束时,将临时列表加入结果列表。外层循环结束时结果列表中存储的即为层序遍历的结果。
Java代码:
class Solution { public List < List < Integer > > levelOrder ( TreeNode root) { List < List < Integer > > result = new ArrayList < > ( ) ; if ( root == null ) return result; Queue < TreeNode > queue = new LinkedList < > ( ) ; queue. offer ( root) ; while ( ! queue. isEmpty ( ) ) { int size = queue. size ( ) ; List < Integer > list = new ArrayList < > ( ) ; for ( int i = 0 ; i < size; i++ ) { TreeNode node = queue. poll ( ) ; list. add ( node. val) ; if ( node. left != null ) queue. offer ( node. left) ; if ( node. right != null ) queue. offer ( node. right) ; } result. add ( list) ; } return result; }
}
复杂度分析:
时间复杂度: O(n),其中 n 是树的节点总数。空间复杂度: O(n),队列中最多存储同一层的节点数。
解题思路:
终止条件: 数组为空或长度为0时返回 null。递归构建:
找到当前数组的中点,作为当前子树的根节点。 递归处理左半部分数组(左子树)。 递归处理右半部分数组(右子树)。
Java代码:
class Solution { public TreeNode sortedArrayToBST ( int [ ] nums) { return buildBST ( nums, 0 , nums. length - 1 ) ; } private TreeNode buildBST ( int [ ] nums, int left, int right) { if ( left > right) return null ; int mid = ( left + right) / 2 ; TreeNode root = new TreeNode ( nums[ mid] ) ; root. left = buildBST ( nums, left, mid - 1 ) ; root. right = buildBST ( nums, mid + 1 , right) ; return root; }
}
复杂度分析:
时间复杂度: O(n),每个节点被访问且仅被访问一次。空间复杂度: O(log n),递归栈的深度为树的高度,平衡二叉树的高度为 log n。