扣初级算法-23-树-二叉树的最大深度

学习目标:

本次学习目标为 力扣初级算法-树,其中主要的LC如下:

  • 二叉树的最大深度

学习内容:

  1. 二叉树的最大深度 -----([链接](https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnd69e/)
    给定一个二叉树,找出其最大深度。
    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    说明: 叶子节点是指没有子节点的节点。

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

解题思路:

  • 解法一: 直接递归

  • 代码实现:

/**
	 * 解法一: 直接递归
	 */
	public int maxDepth01(TreeNode root) {
		return null == root ? 0 : Math.max(maxDepth01(root.left), maxDepth01(root.right)) + 1;
	}

  • 解法二: BFS

  • 边界问题: 入参的树结构是空

  • 代码逻辑过程:

    • 声明双端队列
    • 将根节点放入到双端队列中
    • 声明深度 为 depthNum
    • 当前层的个数,并循环遍历她的子节点
    • 判断子节点是否存在,如果存在则继续加在双端队列的尾巴上
  • 代码实现:

/**
	 * 解法二: BFS
	 */
	public int maxDepth02(TreeNode root) {
		// 边界问题: 入参的树结构是空
		if (null == root){
			return 0;
		}
		// 声明双端队列
		Deque<TreeNode> depthQueue = new LinkedList<>();
		// 将根节点放入到双端队列中
		depthQueue.push(root);
		// 声明深度 为 depthNum
		int depthNum = 0;
		while (!depthQueue.isEmpty()){
			// 当前层的个数,并循环遍历她的子节点
			int size = depthQueue.size();
			while (size -- > 0){
				TreeNode currentNode = depthQueue.pop();
				// 判断子节点是否存在,如果存在则继续加在双端队列的尾巴上
				if (null != currentNode.left){
					depthQueue.addLast(currentNode.left);
				}
				if (null != currentNode.right){
					depthQueue.addLast(currentNode.right);
				}
				depthNum ++;

			}
		}
		return depthNum;

	}

  • 解法三:

  • 边界问题: 入参的树结构是空

  • 代码逻辑过程:

    • 声明两个栈,一个栈用来存放节点,一个栈用来存在层级
    • 写入第一层相关的数据
    • 循环遍历栈上所有的节点,同时入栈时,level 数只存最大的值
  • 代码实现:

	/**
	 * 解法三: DFS
	 */
	public int maxDepth03(TreeNode root) {
		// 边界问题: 入参的树结构是空
		if (null == root){
			return 0;
		}

		// 声明两个栈,一个栈用来存放节点,一个栈用来存在层级
		Stack<TreeNode> stack = new Stack<>();
		Stack<Integer> level = new Stack<>();

		// 写入第一层相关的数据
		stack.push(root);
		level.push(1);

		int max = 0;

		// 循环遍历栈上所有的节点,同时入栈时,level 数只存最大的值
		while (!stack.isEmpty()){
			TreeNode pop = stack.pop();
			Integer tempLevel = level.pop();
			max = Math.max(max, tempLevel);

			if (null != pop.left){
				stack.push(pop.left);
				level.push(tempLevel + 1);
			}


			if (null != pop.right){
				stack.push(pop.right);
				level.push(tempLevel + 1);
			}
		}

		return max;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值