代码随想录算法训练营第十六天|LeetCode104.二叉树的最大深度|LeetCode111.二叉树的最小深度|LeetCode222.完全二叉树的节点个数

LeetCode104.二叉树的最大深度

(1)递归

        基本思路:如果能分别求得左右子树的深度,那么整个二叉树的最大深度就是两个子树中的较大值+1(根节点)。可以通过递归的方式得到左右两子树的深度。

Java代码如下:

    public int maxDepth(TreeNode root) {
    	if(root == null) return 0;
    	int left = maxDepth(root.left);
    	int right = maxDepth(root.right);
    	return Math.max(left, right) + 1;
    }

 

 

(2)迭代

        基本思路:使用一个队列,于基本递归换迭代方法类似,需要一个变量来控制每一层的结尾。可以使用添加之前的队列size来做。

Java代码如下:

public int maxDepth(TreeNode root) {
    	if(root == null) return 0;
    	int ans = 0;
    	Queue<TreeNode> queue = new LinkedList<>();
    	queue.offer(root);
    	while(!queue.isEmpty()) 
    	{
    		int size = queue.size();
    		for(int i = 0; i < size ; i++) 
    		{
    			TreeNode node = queue.poll();
    			if(node.left != null) 
    			{
    				queue.offer(node.left);
    			}
    			if(node.right != null) 
    			{
    				queue.offer(node.right);
    			}
    		}
    		ans++;
    	}
    	return ans;
    }

 LeetCode111.二叉树的最小深度

(1)递归

        基本思路:于104类似,只是判断条件改变了。

Java代码如下:

    public int minDepth(TreeNode root) {
    	if(root == null) return 0;
    	if(root.left == null && root.right == null) 
    	{
    		return 1;
    	}
    	
    	int ans = Integer.MAX_VALUE;
    	if(root.left != null) 
    	{
    		ans =  Math.min(minDepth(root.left), ans);
    	}
    	
    	if(root.right != null) 
    	{
    		ans = Math.min(minDepth(root.right),ans);
    	}
    	return ans + 1;
    }

 

 

(2)迭代

        基本思路:于104思路基本相似,当遍历到当前的节点的左右孩子都为空的时候,就直接返回当前层数,因为队列中存放的是当前层所有的节点,当有一个节点的左右孩子为空了,说明当前层就是最小深度。

Java代码如下:

public int minDepth(TreeNode root) {
    	if(root == null) return 0;
    	int ans = 1;
    	Queue<TreeNode> queue = new LinkedList<>();
    	queue.offer(root);
    	while(!queue.isEmpty()) 
    	{
    		int size = queue.size();
    		for(int i = 0; i < size; i++) 
    		{
    			TreeNode node = queue.poll();
    			if(node.left == null && node.right == null) 
    			{
    				return ans;
    			}
    			if(node.left != null) 
    			{
    				queue.offer(node.left);
    			}
    			if(node.right != null) 
    			{
    				queue.offer(node.right);
    			}
    		}
    		ans++;
    	}
    	return 0;
    }

 LeetCode222.完全二叉树的节点个数

        基本思路:本题可以使用上述两题的递归和迭代方法遍历每个节点并且计数。但是题目给定二叉树为完全二叉树,完全二叉树只有两种情况:

        情况一:就是满二叉树,情况二:最后一层叶子节点没有满。对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

        情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

Java代码如下:


    public int countNodes(TreeNode root) {
    	if(root == null) 
    	{
    		return 0;
    	}
    	TreeNode left = root.left;
    	TreeNode right = root.right;
    	int leftDepth = 0;
    	int rightDepth = 0;
    	while(left != null) 
    	{
    		left = left.left;
    		leftDepth++;
    	}
    	while(right != null) 
    	{
    		right = right.right;
    		rightDepth++;
    	}
    	if(leftDepth == rightDepth) 
    	{
    		return (2 << leftDepth) - 1;
    	}
    	return countNodes(root.left) + countNodes(root.right) + 1;
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值