题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点?
自己解答:
//记录最大直径 private int dis = 0;
private class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public int diameterOfBtree(TreeNode root) { dfs(root); return dis; }
public int dfs(TreeNode root) {
//递归出口
if (root == null) {
return 0;
}
//抽象获取左右孩子的最大直径(最大左直径+最大右直径),考虑一下有可能最长路径不经过根节点
int leftDis = dfs(root.left);
int rightDis = dfs(root.right);
//有可能最长路径不经过根节点,需要做特殊处理
dis = Math.max(leftDis + rightDis , dis);
//返回值需要给父节点进行判断(抽象思维)
return Math.max(leftDis, rightDis) + 1;
}
**一个c++的错误示范:(该解答曾经误导过我)
该解答的问题在于把distances放进了递归方法中,边界条件会出现错误示例**
class Solution{
public:
//这样的一个最长的直径肯定是以某个结点为根节点的子树的左右子树高度之和。只需要深搜遍历即可。
int diameterOfBinaryTree(TreeNode* root){
int distances = 0;
dfs(root, distances);
return distances;
}
//distances是以root为根节点的子树的最长路径,即root到其左子树的最深结点长度+root到其右子树的最深结点长度
int dfs(TreeNode* root, int& distances) {
if(!root) return 0; // 根结点为空结点则最长路径肯定是0
int leftHeight = dfs(root->left, distances);
int rightHeight = dfs(root->right,distances);
//当前以root为根结点(设此结点为A)的左右子树高度和是distances
distances = max(leftHeight + rightHeight, distances);
//这里的返回值会赋给A结点的父节点(设为B),而A是B的左结点。return的值应该是B的左子树,即A的最大直径+B结点本身,而 不能return A结点的distances+1
return max(rightHeight, leftHeight)+1;
}
};