编程之美--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

浙公网安备 33010602011771号