二叉树节点间的最大距离问题

本文介绍了一种算法,用于解决二叉树中任意两个节点之间的最大距离问题。通过后序遍历的方式,考虑了最大距离可能出现在左子树、右子树或跨过根节点的情况,并确保了算法的时间复杂度为O(N)。

【题目】

从二叉树的节点A出发,可以向上或向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫做A到B的距离。
给定一棵二叉树的头结点head,求整棵树上节点间的最大距离。

【要求】

如果二叉树的节点数为N,时间复杂度要求为O(N)。

【代码】

    //二叉树节点间的最大距离问题
    public static int maxDistance(Node head){
        int[] record=new int[1];
        return posOrder(head,record);
    }

    //后序遍历,每棵树都执行该步骤
    //最大距离来自三种情况
    //1、h左子树上的最大距离
    //2、h右子树上的最大距离
    //3、h左子树上离h.left最远的距离+1+h右子树上离h.right最远的距离
    private static int posOrder(Node head, int[] record) {
        if(head==null){
            record[0]=0;
            return 0;
        }
        int lMax=posOrder(head.left,record);//h左子树最大距离
        int maxfromLeft=record[0];//左子树距离h左孩子最远距离
        int rMax=posOrder(head.right,record);//h右子树最大距离
        int maxfromRight=record[0];//右子树距离右孩子最远距离
        int curNodeMax=maxfromLeft+maxfromRight+1;
        record[0]=Math.max(maxfromRight, maxfromLeft)+1;//h树上距离h最远的距离
        return Math.max(Math.max(lMax,rMax), curNodeMax);//h树上最大距离  
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值