码迷,mamicode.com
首页 > 编程语言 > 详细

【算法题目】求二叉树中节点的最大距离

时间:2015-08-19 00:11:29      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

  如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数。写一个程序求一颗二叉树中相距最远的两个节点之间的距离(《编程之美》3.8)

 

思路:如果两个节点相距最远,一定是两个叶子节点,或者是一个叶子节点到它的根节点。

   根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论。

     对于任意一个节点,以该节点为根,假设这个根youk个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况。

    1.若路径经过根Root,则U和V是属于不同子树的,且它们都是该子树种到根节点最远的节点,否则跟它们的最远距离矛盾。

    2. 如果路径不经过Root,那么它们一定属于根的k个子树之一。并且它们也是该子树相距最远的两个顶点。

struct Node {
    Node* pLeft;
    Node* pRight;
    int   max_depth; //最大深度
    int   max_distance; //最大距离
};

struct Result {
    int max_depth;
    int max_distance;
};

int Max(int a, int b) {
    return a > b ? a : b;
}

Result GetMaxDistance(Node* pRoot) {
    if (pRoot == NULL) {
        Result empty = {0, -1}; //最大化初始化为-1,是因为调用者要对其加1,然后变为0
        return empty;
    }

    Result lhs = GetMaxDistance(pRoot->pLeft);
    Result rhs = GetMaxDistance(pRoot->pRight);
    Result result;
    result.max_depth = Max(lhs.max_depth + 1, rhs.max_depth + 1);
    result.max_distance = Max(Max(lhs.max_distance, rhs.max_distance), lhs.max_depth + rhs.max_depth + 2);
    return result;
}

 

【算法题目】求二叉树中节点的最大距离

标签:

原文地址:http://www.cnblogs.com/vincently/p/4740957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!