有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class Tree {
TreeNode max, min;
int max_val = Integer.MIN_VALUE, min_val = Integer.MAX_VALUE;
int max_deep = 0, min_deep = 0;
List<TreeNode> list_max = new ArrayList<TreeNode>();
List<TreeNode> list_min = new ArrayList<TreeNode>();
boolean flag = false;
public int getDis(TreeNode root) {
findMaxAndMin(root, 0);
findMaxRoute(root);
flag = false;
findMinRoute(root);
int index = 0;
for(; index<Math.min(list_max.size(), list_min.size()); index++)
if(list_max.get(index) != list_min.get(index))
break;
return max_deep + min_deep - (index - 1)* 2;
}
public void findMaxAndMin(TreeNode root, int deep) {
if(root == null) return;
if(root.left == null && root.right == null && root.val > max_val) {
max_val = root.val;
max = root;
max_deep = deep;
}
if(root.left == null && root.right == null && root.val < min_val) {
min_val = root.val;
min = root;
min_deep = deep;
}
findMaxAndMin(root.left, deep + 1);
findMaxAndMin(root.right, deep + 1);
}
public void findMaxRoute(TreeNode root) {
if(root == null) return;
if(root == max) {
flag = true;
return;
}
if(!flag) {
list_max.add(root);
findMaxRoute(root.left);
//list_max.remove(root.left);
if(!flag)
findMaxRoute(root.right);
//list_max.remove(root.right);
if(!flag)
list_max.remove(root);
}
}
public void findMinRoute(TreeNode root) {
if(root == null) return;
if(root == min) {
flag = true;
return;
}
if(!flag) {
list_min.add(root);
findMinRoute(root.left);
//list_max.remove(root.left);
if(!flag)
findMinRoute(root.right);
//list_max.remove(root.right);
if(!flag)
list_min.remove(root);
}
}
}
思路比较简单,
(1)先遍历二叉树找到最大值和最小值的位置和深度,
(2)用dfs找到从root到最大最小节点的路径
(3)找到它们的最近ancestor及其深度
(4)计算得到结果