部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

编程之美--3.8求二叉树中节点的最大距离

问题:
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

解法:

利用递归的方法,求出每一个节点左右子树的高度,那么以该节点为根节点的最大距离为左子树高度+右子树高度+2。
在分别求出每一个节点的最大距离后,比较出一个最大值,这个值就是整棵树的最大距离。

程序中二叉树的结构

main函数:

public static void main(String args[]){
    ChainTree mytree = new ChainTree();
    mytree.insert(24);
    mytree.insert(14);
    mytree.insert(45);
    mytree.insert(13);
    mytree.insert(23);
    mytree.insert(25);
    mytree.insert(70);
    mytree.insert(38);
    mytree.insert(50);
    mytree.insert(95);
    mytree.insert(59);
    mytree.insert(96);
    mytree.getAllDepth(mytree.rootnode);
    
    List dis_list = new ArrayList();
    mytree.GetDistance(mytree.rootnode,dis_list);
    System.out.println("整棵树的最远距离为:"+GetMax(dis_list));
    
}

 

节点类

class Node{ //节点类
    int key; //关键字
    Node lnode; //左节点
    Node rnode; //右节点
    int height; //当前节点的高度
    int maxDistance; //以当前节点为根节点的最远距离
    
    public Node(int key){this.key=key;}
    public Node(){}
}


树类,这里用的是有序二叉树

class ChainTree{//树类,这里为有序二叉树
    Node rootnode; //树根
    
    public void insert(int key){//插入元素
        Node node = new Node(key);
        if(rootnode==null){
            rootnode = node;
        }
        else{
            Node temp = rootnode;
            Node parent ;
            while(true){//寻找插入位置
                parent = temp;
                if(key<temp.key){ //进入左子树内查找
                    temp=temp.lnode;
                    if(temp==null){
                        parent.lnode=node;    
                        return;
                    }
                }
                else{//进入右子树内查找
                    temp=temp.rnode;
                    if(temp==null){
                        parent.rnode=node;
                        return;                                
                    }
                }
            }
        }
    }//end insert
    
    //显示该节点信息
    public void DisplayNode(Node node){
        System.out.println(node.key+" , 节点高度为:"+node.height+",最远距离为:"+node.maxDistance);
    }

    //先序遍历 递归,获取所有的最大距离
    public void GetDistance(Node node,List<Integer> distance){
        if(node!=null){
            DisplayNode(node);
            distance.add(node.maxDistance);
            GetDistance(node.lnode,distance);            
            GetDistance(node.rnode,distance);
        }
    }    
    
    //计算二叉树每一个节点的深度,同时算以该节点为根节点的最远距离
    public int getAllDepth(Node node){
        if(node == null){
            return 0;            
        }
        else {
            int ldepth = getAllDepth(node.lnode);
            int rdepth = getAllDepth(node.rnode);
            node.maxDistance = ldepth+rdepth; //不用加2,因为计算高度的时候每侧都已经加1了。
            if(ldepth>rdepth){
                node.height=ldepth+1;
                return ldepth+1;
            }
            else {
                node.height = rdepth +1;
                return rdepth+1;
            }
        }        
    }
    
}

 

运行结果:

24 , 节点高度为:5,最远距离为:6
14 , 节点高度为:2,最远距离为:2
13 , 节点高度为:1,最远距离为:0
23 , 节点高度为:1,最远距离为:0
45 , 节点高度为:4,最远距离为:5
25 , 节点高度为:2,最远距离为:1
38 , 节点高度为:1,最远距离为:0
70 , 节点高度为:3,最远距离为:4
50 , 节点高度为:2,最远距离为:1
59 , 节点高度为:1,最远距离为:0
95 , 节点高度为:2,最远距离为:1
96 , 节点高度为:1,最远距离为:0
整棵树的最远距离为:6

 

posted @ 2015-06-29 10:55  流了个火  阅读(110)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats