有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为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 {
public int getDis(TreeNode root) {
// write code here
fun(root,"0");
char[] minchars=minstr.toCharArray();
char[] maxchars=maxstr.toCharArray();
int i;
for(i=0;i<minchars.length&&i<maxchars.length;i++)
if(minchars[i]!=maxchars[i])
break;
return minchars.length+maxchars.length-i*2;
}
int min=Integer.MAX_VALUE;
int max=0;
String minstr;
String maxstr;
void fun(TreeNode node,String str)
{
if(node==null)
return;
if(node.left==null&&node.right==null)
{
if(min>node.val)
{
min=node.val;
minstr=str;
}
if(max<node.val)
{
max=node.val;
maxstr=str;
}
}
fun(node.left,str+'0');
fun(node.right,str+'1');
}
} 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 {private TreeNode maxNode = new TreeNode(Integer.MIN_VALUE);private TreeNode minNode = new TreeNode(Integer.MAX_VALUE);public int getDis(TreeNode root) {// write code heregetMaxMin(root);//找到最大最小叶子节点TreeNode lcaNode = getLCA(root);//找LCAint a = getNodeDis(lcaNode, maxNode);//最大值叶子节点到LCA的距离;int b = getNodeDis(lcaNode, minNode);//最小值叶子节点到LCA的距离;return a+b;}// 先找到最大最小叶子节点public void getMaxMin(TreeNode root) {if (root == null) {return;}if (root.left == null && root.right == null) {if (root.val > maxNode.val) {maxNode = root;} else if (root.val < minNode.val) {minNode = root;}}getMaxMin(root.left);getMaxMin(root.right);}// LCA最近公共祖先public TreeNode getLCA(TreeNode root) {if (root == null) {// 说明是空树return null;}if (root.val == maxNode.val || root.val == minNode.val) {// 在当前树的根节点上找到两个节点之一return root;}TreeNode leftNode = getLCA(root.left);// 左子树中的查找两个节点并返回查找结果TreeNode rightNode = getLCA(root.right);// 右子树中查找两个节点并返回查找结果if (leftNode == null) {// 左子树中没找到,则一定在右子树上return rightNode;} else if (rightNode == null) {// 右子树没找到一定在左子树上return leftNode;} else {// 左右子树均找到一个节点,则根节点为最近公共祖先return root;}}//获取叶子节点到LCA距离public int getNodeDis(TreeNode lcaNode, TreeNode node){if(lcaNode==null){return -1;}if(lcaNode.val==node.val){return 0;}//三种情况:两个均在左子树;两个均在右子树;一左一右,所以不能用if-elseif结构int distance = getNodeDis(lcaNode.left, node);//左子树未找到两个节点之一if(distance==-1){distance = getNodeDis(lcaNode.right, node);}if(distance!=-1){return distance+1;}return -1;}
//典型的二进制编码题,算出叶子节点二进制编码,再比编码,计算后缀长度和
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 {
private int max=0;
private int min=99999;
private StringBuilder maxcodec;
private StringBuilder mincodec;
void PreOrder(TreeNode T,char code,StringBuilder codec){
if(T!=null){
codec.append(code);
if(T.left==null && T.right==null)
{
if(max<T.val)
{
max=T.val;
maxcodec = codec;
}
if(min>T.val)
{
min=T.val;
mincodec = codec;
}
}
PreOrder(T.left,'0',new StringBuilder(codec));
PreOrder(T.right,'1',new StringBuilder(codec));
}
}
public int getDis(TreeNode root) {
PreOrder(root,'0',new StringBuilder());
int index=0;
for(index=0; index<(maxcodec.length()>mincodec.length()?maxcodec.length():mincodec.length());index++)
{
if(maxcodec.charAt(index)!=mincodec.charAt(index))
break;
}
return (maxcodec.substring(index).length()+mincodec.substring(index).length());
// write code here
}