LeetCode 二叉树的最大深度及直径

       今天温习了过去解决的一些题目,发现关于二叉树的问题还是蛮有意思的,因为它们有着很多的共同点,而且多是通过递归思维解决,因此也有助于我们的逻辑能力的提升,下面给大家分享两道比较类似的二叉树问题~     

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

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

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

       示例:给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

       返回它的最大深度 3 。

       这里我分别给出了递归和迭代两种求解方式:

package com.gaoxue.LeetCode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树的最大深度
 * @author Administrator
 *
 */
public class MaximumDepthBinaryTree {

        //递归方式
	public int maxDepth(TreeNode root) {
            return root == null ? 0 : (1 + Math.max(maxDepth(root.left), maxDepth(root.right)));
        }
        //迭代方式(堆栈) 
        public int maxDepth2(TreeNode root) {
        if (root == null) return 0;
        int res = 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while (!q.isEmpty()) {
            ++res;
            int n = q.size();
            for (int i = 0; i < n; ++i) {
                TreeNode t = q.poll();
                if (t.left != null) q.offer(t.left);
                if (t.right != null) q.offer(t.right);
            }
        }
        return res;
        }
	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		System.out.println(new MaximumDepthBinaryTree().maxDepth(root));
	}
}

       给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。

       示例 :给定二叉树

          1
         / \
        2   3
       / \     
      4   5    

       返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

       注意:两结点之间的路径长度是以它们之间边的数目表示。

       这里我给出了递归求解方式,当然也通过迭代方式搞定,大家可以加以思考自行实现:

package com.gaoxue.LeetCode;
/**
 * 递归求解二叉树直径
 * @author Administrator
 *
 */
public class DiameterBinaryTree {

    int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        maxDepth(root);
        return max;
    }
    private int maxDepth(TreeNode root) {
        if (root == null) return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        max = Math.max(max, left + right);
        return Math.max(left, right) + 1;
    }
	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		System.out.println(new DiameterBinaryTree().diameterOfBinaryTree(root));
	}
}
       自己觉着这两道题的实现区别主要就是递归方法参数的不同,前者以左右节点为参数比较左右部分,后者则把根节点作为参数比较全局,当我们理清共同信息要素后题目自然就迎刃而解啦,所以还是戒骄戒躁、砥砺前行哈~
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值