前提: 二叉树的每个节点都有一个指向夫节点的parent指针,遍历找到二叉树中想求距离的节点,将两个节点到根节点之间经过的所有节点存入set,那么set的大小就是距离.
分析:无论是否经过头节点,无论怎样都是要汇集到头节点的
- 情况一: 不在同一子树,那么两边的路径只有根节点重合
- 情况二:在同一子树,必然有公用的节点,两条路径中选择任意一条将沿途节点存入Set,另一条路径上的节点存入set时判断如果已经存在,就将已存在的删除且不加入set,最后Set的大小就是经过的路径(不是节点数)
- 归结起来,无论经过头节点与否一个Set都可以解决
代码以求权值最大节点到权值最小节点的距离(包括叶节点)为例
//找出二叉树中权值最大的路径, 找出最大和最小的两个节点
public static int maxAndMinNodePassedNode(Node node){
if(node == null){
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(node);
Node min = new Node(Integer.MAX_VALUE);
Node max = new Node(Integer.MIN_VALUE);
while (!queue.isEmpty()){
Node cur = queue.poll();
if(cur.val < min.val){
min = cur;
}
if(cur.val > max.val){
max = cur;