您的位置:首页 > 其它

二叉树中相距最远的两个节点之间的距离

2016-08-19 00:21 387 查看
看了milo的解答:《编程之美: 求二叉树中节点的最大距离》的另一个解法

struct TreeNode{
TreeNode * left;
TreeNode * right;
int val;
TreeNode(int _val, TreeNode * _left, TreeNode * _right) :
val(_val), left(_left), right(_right){}
TreeNode(int _val) :val(_val), left(NULL), right(NULL){}
};

struct Result{
int maxDistance;
int maxDepth;
Result(int _maxDistance, int _maxDepth) :
maxDistance(_maxDistance), maxDepth(_maxDepth){}
Result(){}
};

Result getMaxDis(TreeNode * root){
if (!root){
return Result(0, -1); //depth在上层会加上1,所以这里传入0
}
Result res;
Result resLeft = getMaxDis(root->left);
Result resRight = getMaxDis(root->right);
res.maxDepth = max(resLeft.maxDepth, resRight.maxDepth) + 1;
res.maxDistance = max(max(resLeft.maxDistance, resRight.maxDistance), resLeft.maxDepth + resRight.maxDepth + 2);
return res;
}

int getMaxDistance(TreeNode * root){
Result result = getMaxDis(root);
return max(result.maxDepth, result.maxDistance);
}


还有一种方式也是大同小异的:

void longestPathUtil(Node* root, int& left_len, int& right_len, int& max_len);
int longestPath(Node* root)
{
int left_len, right_len, max_len;
longestPathUtil(root, left_len, right_len, max_len);
return max_len;
}

void longestPathUtil(Node* root, int& left_len, int& right_len, int& max_len)
{
if(root==NULL)
{
left_len = 0;
right_len = 0;
max_len = 0;
return;
}

int left_len1, right_len1, left_len2, right_len2;
longestPathUtil(root->left, left_len1, right_len1, max_len);
longestPathUtil(root->right, left_len2, right_len2, max_len);

left_len = 1+max(left_len1, right_len1);
right_len = 1+max(left_len2, right_len2);
max_len = max(left_len+right_len-1, max_len);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: