题目的链接在这里:https://leetcode-cn.com/problems/diameter-of-binary-tree/
题目大意
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
一、示意图
二、解题思路
递归和DFS
递归
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
//其实那肯定是 左边的最长到右边的最长
//先进行边界判断
if(root==null)
return 0;
//这里是需要减1的 好像不是减1 而是需要加上1 但是根据题意 路径应该是点数减1
//后来发现是这样的 可能穿过根 也可能不穿过根 那就进行遍历?
int max=mostHeight(root.left)+mostHeight(root.right);
//想想看为什么会出现不穿过根的情况 那就是存在一边非常非常的长 然后交叉很多
//还可以这样判断
if(mostHeight(root.left)>mostHeight(root.right)){
//说明长度大的在左边 那就左边的最大值和当前最大值进行比较
int temp=diameterOfBinaryTree(root.left);
return max>temp?max:temp;
}
else{
//那就是在右边 也需要进行递归判断
int temp=diameterOfBinaryTree(root.right);
return max>temp?max:temp;
}
}
private int mostHeight(TreeNode root) {
if(root==null)
return 0;
return Math.max(mostHeight(root.left),mostHeight(root.right))+1;
}
}
DFS
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int max=0;
//直接就遍历每一个root
public int diameterOfBinaryTree(TreeNode root) {
if(root==null)
return 0;
dfs(root);
return max;
}
private int dfs(TreeNode root) {
if(root.left==null&&root.right==null)
return 0;
int leftSize=root.left==null?0:dfs(root.left)+1;
int rightSize=root.right==null?0:dfs(root.right)+1;
//然后当前的值 返回的应该是 max和左边加右边的值
max=Math.max(max,leftSize+rightSize);
//max就是用来统计的 但是这个值返回的依然是他的长度
return Math.max(leftSize,rightSize);
}
}