有一棵二叉樹,樹上每個點標有權值,權值各不相同,請設計一個算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離爲1,一個節點經過多少條邊到達另一個節點爲這兩個節點之間的距離。
給定二叉樹的根節點root,請返回所求距離。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
<span style="color: rgb(0, 188, 155); font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 18px; white-space: nowrap;">//典型的二進制編碼題,算出葉子節點二進制編碼,再比編碼,計算後綴長度和</span>
public class Tree {
private StringBuilder maxCode = new StringBuilder();
private StringBuilder minCode = new StringBuilder();
private int min = Integer.MAX_VALUE;
private int max = Integer.MIN_VALUE;
public void preOrder(TreeNode root, char c, StringBuilder code) {
if(root != null) {
code.append(c);
if(root.left == null && root.right == null) {
if(min > root.val) {
min = root.val;
minCode = code;
}
if(max < root.val) {
max = root.val;
maxCode = code;
}
}
preOrder(root.left, '0', new StringBuilder(code));
preOrder(root.right, '1', new StringBuilder(code));
}
}
public int getDis(TreeNode root) {
preOrder(root, '0', new StringBuilder());
int index = 0;
for(index = 0; index < (maxCode.length() > minCode.length() ? maxCode.length() : minCode.length()); index++) {
if(maxCode.charAt(index) != minCode.charAt(index)) {
break;
}
}
return (maxCode.substring(index).length() + minCode.substring(index).length());
}
}