给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
**示例:**给定二叉树 [3,9,20,null,null,15,7]
,
思考
第一种方法,层次遍历
第二种方法,前序遍历递归法
层次遍历
layerNodes:代表当前层节点数
temp:下一层节点数
max:代表最大深度
package 力扣;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* @author yyq
* @create 2022-04-07 10:50
*/
public class leetcode104 {
public int maxDepth(TreeNode root) {
int max = 0;
int LayerNodes = 1;
Queue<TreeNode> queue=new LinkedList<>();
if(root==null) return max;
queue.add(root);
while (!queue.isEmpty()){
int temp = 0;
while (LayerNodes!=0){
TreeNode treeNode = queue.poll();
if(treeNode.left!=null)
{
queue.add(treeNode.left);
temp++;
}
if(treeNode.right!=null)
{
queue.add(treeNode.right);
temp++;
}
LayerNodes--;
}
LayerNodes=temp;
max++;
}
return max;
}
}
效率较低
前序遍历递归法
其实就是直接套用前序遍历代码。
其中:
- temp:代表的是访问的当前层数
- max[0]:因为是引用类型,所以可以用来记录最大层数
public static int maxDepth(TreeNode root){
int[] max=new int[1];
max[0]=0;
int temp=0;
if(root==null) return max[0];
preOrder(temp,max,root);
return max[0];
}
private static int preOrder(int temp, int[] max, TreeNode root) {
temp++;
if (temp>max[0]) max[0]=temp;
if(root.left!=null) {
temp = preOrder(temp,max,root.left);
temp--;
}
if(root.right!=null){
temp = preOrder(temp,max,root.right);
temp--;
}
return temp;
}
看起来效率还是很高的,但是递归还是比较占用空间的。