微软算法100题11 求二叉树中两节点之间的最大距离

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

 

 

思路:  一棵树中节点的最大距离,对于根节点来说,可以看做是左子树的最大深度加右子树的最大深度在加上左右各一个深度 (leftDepth + rightDepth + 1 + 1),但有种情况是假如根节点的左子节点,该节点分别有很深的左子树和右子树,则整棵树具有最大间距的节点,可能都分布在该左子树上,压根不会经过根节点。所以考虑到这种情况,在进行递归计算时,需要比较根据深度得到的最大距离和实际左右节点最大距离,找出较大的那个

 

 1 package com.rui.microsoft;
 2 
 3 public class Test11_MaxDistanceBST {
 4 
 5     public static void main(String[] args) {
 6         Node n1 = new Node(1);
 7         Node n2 = new Node(2);
 8         Node n3 = new Node(3);
 9         Node n4 = new Node(4);
10         Node n5 = new Node(5);
11         Node n6 = new Node(6);
12         Node n7 = new Node(7);
13         Node n8 = new Node(8);
14         Node n9 = new Node(9);
15         
16         n1.left = n2; n1.right = n3;
17         n2.left = n4; n2.right = n5;
18         n4.left = n6;
19         n5.right = n7;
20         n6.left = n8;
21         n7.right = n9;
22         
23         int maxDistance = Test11_MaxDistanceBST.calulate(n1).dist;
24         System.out.println(maxDistance);
25     }
26     
27     public static Result calulate(Node node){
28         //if current node doesn't exist
29         //then return 0 distance and -1 depth
30         if(null == node) return new Result(0, -1);
31         
32         Result leftRes = calulate(node.left);
33         Result rightRes = calulate(node.right);
34         
35         //First let's assume the max distance is the left node's depth + right node's depth + left single depth + right single depth
36         int maxDis = leftRes.depth + rightRes.depth + 1 + 1;
37         //Then compare it with real distance value and get the largest one
38         maxDis = max(maxDis, max(leftRes.dist, rightRes.dist));
39         
40         //return the result object, whose depth value should be choosen by comparing left node's depth and right node's depth and plus one single depth value
41         return new Result(maxDis, max(leftRes.depth, rightRes.depth) + 1);
42         
43     }
44     
45     private static int max(int i, int j){
46         return i > j ? i:j;
47     }
48     
49     static class Result{
50         int dist;
51         int depth;
52         Result(int dist, int depth){
53             this.dist = dist;
54             this.depth = depth;
55         }
56     }
57     
58     static class Node {
59         int value;
60         Node left;
61         Node right;
62         public Node(int v){
63             this.value = v;
64         }
65     }
66 }

 

转载于:https://www.cnblogs.com/aalex/p/4904569.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值