画圆的沙滩

亦简亦美

树的直径

编程之美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;
}

posted on 2011-03-21 17:02  acmaru  阅读(154)  评论(0编辑  收藏  举报

导航