剑指offer: 二叉树

题目来源:牛客网

题目描述:

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为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 {
    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(maxT.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
    }
}

你可能感兴趣的:(剑指offer: 二叉树)