二叉树的直径(diameter-of-binary-tree)

二叉树的直径(diameter-of-binary-tree)

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

示例 :
给定二叉树

          1
         / \
        2   3
       / \     
      4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。

思路

一定要看清题目,这里返回的3不是,有1,2,4,这三个节点,说的是路径
二叉树的直径(diameter-of-binary-tree)_第1张图片
所以,从4这个节点出发,离它最近的节点是2,这个时候,他们的距离为1。从图中可以看出,4到3这个节点路径最远,经过的路径为,4到2 ,2到1,1到3,所以二叉树的直径为3。
而从5这个节点出发,也一样,离它最远的节点为3。但是不论如何,从4出发,从5出发也好,任意一条路径可以被写成两个箭头,每个箭头代表一条从某些点向下遍历到孩子节点的路径。
假设,我们知道对于每个节点最长箭头分别为 L,R,那么最优路径经过 L+R+1个节点。

按照常用方法计算一个节点的深度:max(depth of node.left, depth of node.right) + 1。在计算的同时,经过这个节点的路径长度为 1 + (depth of node.left) + (depth of node.right) 。搜索每个节点并记录这些路径经过的点数最大值,期望长度是结果 - 1。

代码一

class Solution {
    /*二叉树的最大深度(maximum-depth-of-binary-tree)
    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) {return 0;}
        int left = diameterOfBinaryTree(root.left);
        int right = diameterOfBinaryTree(root.right);
        return Math.max(left, right) + 1; 
    }*/
    //二叉树的直径(diameter-of-binary-tree)
    private int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        depth(root);
        return max;
    }
    private int depth(TreeNode root) {
        if (root == null) return 0;
        int leftDepth = depth(root.left);
        int rightDepth = depth(root.right);
        max = Math.max(max, leftDepth + rightDepth);
        return Math.max(leftDepth, rightDepth) + 1;
    }    
}
public class TreeNode {
	public int val;
	public TreeNode left;
	public TreeNode right;
	public TreeNode(int x) {
		val = x;
	}
}

代码二

class Solution {
    int ans;
    public int diameterOfBinaryTree(TreeNode root) {
        ans = 1;
        depth(root);
        return ans - 1;
    }
    public int depth(TreeNode node) {
        if (node == null) return 0;
        int L = depth(node.left);
        int R = depth(node.right);
        ans = Math.max(ans, L+R+1);
        return Math.max(L, R) + 1;
    }
}

总结

建议再看看,二叉树的深度,二叉树的最大深度,二叉树的最小深度,比较一下他们的不同之处。

你可能感兴趣的:(零基础学数据结构,acm,二叉树,算法,数据结构,leetcode)