[Leetcode] 543. Diameter of Binary Tree 解题报告

来源:互联网 发布:德国足球 知乎 编辑:程序博客网 时间:2024/06/04 17:55

题目

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longestpath between any two nodes in a tree. This path may or may not pass through the root.

Example:
Given a binary tree 

          1         / \        2   3       / \           4   5    

Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].

Note: The length of path between two nodes is represented by the number of edges between them.

思路

对于以root为根节点的树来说,其最大半径有两种可能性,一种是该半径经过root,另一种是不经过root。这又可以分为三种情况进行讨论:1)root是叶子结点。此时直接返回0即可;2)root只有一个子树,那么其最大半径既有可能是子树的最大半径,也有可能是root的高度;3)root有两棵子树,那么其最大半径既有可能是两个子树中某个的最大半径,也有可能是经过root的一条半径,而经过root的最大半径一定是左子树的高度加上右子树的高度再加上2。

代码

/** * 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 diameterOfBinaryTree(TreeNode* root) {        if (!root) {            return 0;        }        int height = getHeight(root), right_ret, left_ret;        if (!root->left && !root->right) {            return 0;        }        else if (!root->left) {     // only have right subtree            right_ret = diameterOfBinaryTree(root->right);            return max(height, right_ret);        }        else if (!root->right) {    // only have left subtree            left_ret = diameterOfBinaryTree(root->left);            return max(height, left_ret);        }        else {            left_ret = diameterOfBinaryTree(root->left);            right_ret = diameterOfBinaryTree(root->right);            int left_height = getHeight(root->left);            int right_height = getHeight(root->right);            return max(left_height + right_height + 2, max(left_ret, right_ret));        }    }private:    int getHeight(TreeNode *root) {     // root cannot be NULL        if (!root->left && !root->right) {      // leaf            return 0;        }        else if (!root->left) {            return getHeight(root->right) + 1;        }        else if (!root->right) {            return getHeight(root->left) + 1;        }        else {            return max(getHeight(root->left), getHeight(root->right)) + 1;        }    }};

原创粉丝点击