LeetCode每日一题(2020/3/10)

LeetCode每日一题(2020/3/10)

543. 二叉树的直径

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

示例 :
给定二叉树
1
/
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

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

方法:深度优先搜索。路径长度的最大值可以分为以下3个情况:
1.左子树最大路径
2.右子树最大路径
3.左子树深度加右子树深度加1
因此,可以将问题转化为递归问题,当遍历到空节点时,返回0,其他情况时,返回以当前节点为根节点的子树深度:左子树和右子树深度的最大值加1(1为当前节点)。定义ans数组(全局变量),该数组用于存放当前节点为根节点的子树在上述三种情况下的最大值。

python3:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.ans = 1
        def depth(node):
            if not node:
                return 0
            L = depth(node.left)
            R = depth(node.right)
            self.ans = max(L+R+1,self.ans)
            return max(L,R)+1
        depth(root)
        return self.ans-1

C++:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ans=1;
    int depth(TreeNode* root){
        if(!root) return 0;
        int L = depth(root->left);
        int R = depth(root->right);
        ans=max(ans,L+R+1);
        return max(L,R)+1;
    }
    int diameterOfBinaryTree(TreeNode* root) {
        depth(root);
        return ans-1;
    }
};

你可能感兴趣的:(LeetCode每日一题(2020/3/10))