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

被折叠的 条评论
为什么被折叠?



