剑指 Offer 55 - I. 二叉树的深度——DFS+BFS解题
程序员文章站
2022-07-15 19:48:56
...
一、题目
二、分析
- 二叉数遍历问题一般就两种解题方法:DFS + DFS
- 可参考文章:二叉树遍历系列总结+递归/迭代的统一写法
三、题解
-
DFS
class Solution { public int maxDepth(TreeNode root) { //【递归 实质上就是 DFS】 //递归终止条件 if(root == null) return 0 ; //递归左边 int leftDepth = maxDepth(root.left); //递归左边 int rightDepth = maxDepth(root.right); //更新深度 return Math.max(leftDepth,rightDepth)+1; } }
-
复杂度分析
时间复杂度:我们每个结点只访问一次,因此时间复杂度为 O(N),N 是结点的数量。
空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 N 次(树的高度),因此保持调用栈的存储将是 O(N)。但在最好的情况下(树是完全平衡的),树的高度将是 log(N)。因此,在这种情况下的空间复杂度将是O(log(N))。
-
-
BFS
class Solution { public int maxDepth(TreeNode root) { //【BFS + queue 没啥难度 直接套用模版】 //特例处理 if(root == null) return 0 ; //创建queue 并初始化 LinkedList<TreeNode> queue = new LinkedList(); queue.add(root); //创建深度变量 int depth = 0; while(!queue.isEmpty()){ //更新depth depth++; //获取当前queue的结点个数,便于遍历 int n = queue.size(); //添加当前队列节点 的所有临近结点 for(int i = 0 ; i < n; i++){ //创建当前结点 TreeNode curr = queue.pollFirst(); //添加临近结点 if(curr.left != null) queue.add(curr.left); if(curr.right != null) queue.add(curr.right); } } return depth; } }
- 复杂度分析:
时间复杂度 O(N) : N 为树的节点数量,计算树的深度需要遍历所有节点。
空间复杂度 O(N) : 最差情况下(当树平衡时),队列 queue 同时存储 N/2 个节点。
- 复杂度分析: