二叉树的最大深度问题的两种普遍解法

二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例题目:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。

节点的数据结构如下:
/

  • Definition for a binary tree node.
  • public class TreeNode {
  • int val;
    
  • TreeNode left;
    
  • TreeNode right;
    
  • TreeNode(int x) { val = x; }
    
  • }
    /*

思路一:最简单的解决办法是递归。一棵树的最大深度,等于其左右子树二者中的最大深度加上根结点带来的深度1。
当一个结点为null时,其深度为0。这就是递归的结束条件。
复杂度分析:
时间复杂度:我们每个结点只访问一次,因此时间复杂度为 O(N),
其中 N 是结点的数量。
空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 N 次(树的高度),因此保持调用栈的存储将是 O(N)。但在最好的情况下(树是完全平衡的),树的高度将log(N)。因此,在这种情况下的空间复杂度将是 O(log(N))。

具体递归过程如下:
在这里插入图片描述

主要代码实现:

 2     public static int getMaxDepth(TreeNode root) {
 3         if (root == null)
 4             return 0;
 5         else {
 6             int left = getMaxDepth(root.left);
 7             int right = getMaxDepth(root.right);
 8             return 1 + Math.max(left, right);
 9         }
 		}

思路二:将递归转换成迭代,采用队列分层存储每层节点 ,遍历每层后,下一层左右叶子节点若存在,则入队列,迭代开始操作节点前,计数变量记录层数。
通过创建FIFO队列,迭代每一层元素,每迭代一层,level+1
当一个根结点为null时,其深度为0。
复杂度分析:
时间复杂度为O(n),空间负杂度,取决于栈中元素,最坏情况为O(n)
主要代码实现:

  public static int getMaxDepth(TreeNode root){
  		int levels = 0;
  		if(root==null) return levels;
  		//队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端			进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。 
  		Queue<TreeNode>  queue = new LinkedList<>();
  		queue.add(root);
  		while(!queue.isEmpty()){
  			levels++;
  	   		int size = queue.size();
  	   		for(int i = 0;i<size;i++){
  	   			root = queue.poll();
  	   			if(root.left!=null){queue.add(root.left)}
  	   			if(root.right!=null){queue.add(root.right)}
  	   		}
  		}
  		return levels;
  	}
  }

参考文档:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/104java-di-gui-die-dai-by-ustcyyw/
参考文档:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/er-cha-shu-de-zui-da-shen-du-by-leetcode/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值