树的直径
编程之美3.8。这题让我想起了另外一道著名的题目:lowest common root. 两题都是典型的树之上的DP。下面为实现:
struct Node {
int v;
Node *left, *right;
};
size_t diameter(Node* root, size_t& depth) {
depth = 0;
if (!root) return 0;
size_t ldepth, rdepth;
size_t ldiameter = diameter(root->left, ldepth);
size_t rdiameter = diameter(root->right, rdepth);
depth = max(ldepth, rdepth) + 1;
return max(ldepth + rdepth + 2, max(ldiameter, rdiameter));
}
size_t lcr(Node* root, Node* a, Node* b, Node*& v) {
if (!root) return 0;
size_t nl = lcr(root->left, a, b, v);
if (nl == 2) return 2;
size_t nr = lcr(root->right, a, b, v);
if (nr == 2) return 2;
size_t nm = nl + nr + (root == a || root == b);
if (nm == 2) v = root;
return nm;
}