数据结构和算法经典100题-第29题

题目要求:二叉树节点间的最大距离问题从二叉树的节点A出发,可以向上走或者向下走,但沿途的节点只能经过一次,当达到节点B时,路径上的节点数叫作A到B的距离。比如:

            1
        2       3
    4     5   6    7

节点4和节点2的距离为2,节点5和节点6的距离为5。现在给定一棵二叉树的头结点,求整棵二叉树上节点间的最大距离。


题目解析:
此问题不难解决,也算是经典的问题了吧。其实节点间的最大距离有以下三种情况:
1.是其左子树上两节点间的最大距离;
2.是其右子树上两节点间的最大距离;
3.是其左子树上的高度+其右子树的高度+1;
比较这三个值就可以解决了,后序遍历二叉树,递归的每次从下至上返回树高以及其节点最大距离就okay了。


Okay,no code say what?

struct Node {
    int value;
    Node *left;
    Node *right;
};

void getDistence(Node *head, int &maxHigh, int &maxDis) {

    int maxLeftDis = 0;
    int maxRightDis = 0;
    int maxLeftHigh = 0;
    int maxRightHigh = 0;

    if (!head) {

    }

    if (!head->left) {
        getDistence(head->left, maxLeftHigh, maxLeftDis);
    }
    if (!head->right) {
        getDistence(head->right, maxRightHigh, maxRightDis);
    }
    maxHigh = (maxLeftHigh > maxRightHigh) ? (maxLeftHigh + 1) : (maxRightHigh + 1);
    maxDis = (maxLeftDis > maxRightDis) ? (maxLeftDis) : (maxRightDis);
    maxDis = (maxDis > maxHigh) ? maxDis : maxHigh;
    return ;
}

路漫漫其修远兮,吾将上下而求索…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值