问题
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
例子
思路
树的最大深度=max(左子树最大深度, 右子树最大深度)+1
直径:结点的左子树最大深度+右子树最大深度
不一定过根节点:可能直径的路径过其他结点
- 方法1
二重递归(很多重复计算) - 方法2
一重递归(更好)
深度为4时,直径为3 1234有三条线
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#方法1
class Solution:
#结点的直径:左右子树的最大深度和
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if root is None: return 0
#结点的直径
a=self.maxDepth(root.left)+self.maxDepth(root.right)
#结点的左子树的直径
b=self.diameterOfBinaryTree(root.left)
#结点的右子树的直径
c=self.diameterOfBinaryTree(root.right)
return max(a,b,c)
#结点的最大深度
def maxDepth(self,root):
if root is None: return 0
#左右结点的最大深度+1
print(root.val)
return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
#方法2
class Solution:
max_=0
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.depth(root)
return self.max_
def depth(self,root):
if root is None: return 0
l=self.depth(root.left)
r=self.depth(root.right)
if l+r>self.max_:
self.max_=l+r
return max(l,r)+1
class Solution {
//结点的直径:左右子树的最大深度和
public int diameterOfBinaryTree(TreeNode root) {
if (root==null) return 0;
//结点的直径
int a = maxDepth(root.left)+maxDepth(root.right);
//#结点的左子树的直径
int b = diameterOfBinaryTree(root.left);
//#结点的右子树的直径
int c = diameterOfBinaryTree(root.right);
return Math.max(a,Math.max(b,c));
}
//结点的最大深度
public int maxDepth(TreeNode root) {
if (root==null) return 0;
//左右结点的最大深度+1
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
}
//方法2
class Solution {
private int max_=0;
public int diameterOfBinaryTree(TreeNode root) {
maxDepth(root);
return this.max_;
}
//求结点的最大深度,1+max(左子树最大深度,右子树最大深度),其中左子树最大深度+右子树最大深度为结点为根的直径
public int maxDepth(TreeNode root) {
if (root==null) return 0;
int L = maxDepth(root.left);
int R = maxDepth(root.right);
max_=Math.max(max_, L+R);
return Math.max(L,R)+1;
}
}