leetcode 543. Diameter of Binary Tree
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 longest path 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.
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 getHeight(TreeNode* root)
{
if(root == NULL)
return 0;
int lh = 0,rh = 0;
if(root->left != NULL)
lh = getHeight(root->left) + 1;
if(root->right != NULL)
rh = getHeight(root->right) + 1;
return max(lh,rh);
}
int diameterOfBinaryTree(TreeNode* root) {
if(root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 0;
int length_left = diameterOfBinaryTree(root->left);
int length_right = diameterOfBinaryTree(root->right);
int lh =0,rh = 0;
if(root->left != NULL)
lh = 1 + getHeight(root->left);
if(root->right != NULL)
rh = 1 + getHeight(root->right);
int h = lh+rh;
if(h < length_left)
h = length_left;
if(h < length_right)
h = length_right;
return h;
}
};
代码中存在许多重复计算的东西,比如一些树的高度
查看到的大佬的代码: 依旧是递归,速度快,占用空间小
class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
int ans=0;
dfs(root, ans);
return ans;
}
int dfs(TreeNode* root, int& ans) {
if (root == nullptr) return 0;
int lmax = dfs(root->left, ans);
int rmax = dfs(root->right, ans);
ans = max(ans, lmax+rmax);
return max(lmax, rmax)+1;
}
};
其中, dfs(TreeNode* root,int& ans)
返回以root为根节点中的点到根节点最远的距离,同时将此树中两个节点间的最大距离存储在ans
中. 不是很理解为啥叫dfs呢.