求二叉树中节点间的最大距离

题目:

求二叉树中节点的最大距离

Example:

这里写图片描述

上面二叉树的最大距离为5,路径为4-2-1-3-6-8

解法:

一个以h为头的树上,最大距离只可能来自以下三种情况

  • h的左子树上的最大距离
  • h的右子树上的最大距离
  • h左子树上离h.left最远的距离+1(h)+h右子树上离h.right最远的距离。

三个值中最大的那个就是整棵h树中最远的距离。

递归法:

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):val(x), left(nullptr), right(nullptr){}
};

int posOrder(TreeNode* root, int &record)
{
    if (root == nullptr)
    {
        record = 0;
        return 0;
    }
    int maxfromLeft;
    int lmax = posOrder(root->left, maxfromLeft);

    int maxfromRight;
    int rmax = posOrder(root->right, maxfromRight);

    int curmax = maxfromLeft + maxfromRight;
    record = max(maxfromLeft, maxfromRight) + 1;
    return max(max(lmax, rmax), curmax);
}

int maxDistance(TreeNode* root)
{
    int record = 0;
    return posOrder(root, record);
}


int main()
{
    TreeNode* root = new TreeNode(1);
    TreeNode* node1 = new TreeNode(2);
    TreeNode* node2 = new TreeNode(3);
    TreeNode* node3 = new TreeNode(4);
    TreeNode* node4 = new TreeNode(5);
    TreeNode* node5 = new TreeNode(6);
    TreeNode* node6 = new TreeNode(7);
    TreeNode* node7 = new TreeNode(8);
    root->left = node1;
    root->right = node2;
    node1->left = node3;
    node1->right = node4;
    node2->left = node5;
    node2->right = node6;
    node5->right = node7;
    cout << maxDistance(root) << endl;
    return 0;
}

非递归法:

int high(TreeNode* root)
{
    if (root == nullptr)
        return 0;
    queue<TreeNode* > que;
    que.push(root);
    int level = 0;
    while (!que.empty())
    {
        ++level;
        int size = que.size();
        while (size != 0)
        {
            root = que.front(); que.pop();

            if (root->left != nullptr)
                que.push(root->left);
            if (root->right != nullptr)
                que.push(root->right);
            --size;
        }
    }
    return level;
}

int maxDistance(TreeNode* root)
{
    if (root == nullptr)
        return 0;
    queue<TreeNode* > que;
    que.push(root);
    int maxPath = 0;
    while (!que.empty())
    {
        root = que.front();
        que.pop();

        maxPath = max(maxPath, (high(root->left) + high(root->right)));
        if (root->left != nullptr)
            que.push(root->left);
        if (root->right != nullptr)
            que.push(root->right);
    }
    return maxPath;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值