zoukankan      html  css  js  c++  java
  • 微软算法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 }
  • 相关阅读:
    查看Android源码版本
    Android中级教程(一)之手机页面的转换setContentView的应用 转
    string 在clone()中的特殊性 (转载)
    关于一个C语言二维数组的问题
    异常机制及throw与throws的区别 (z)
    关于CHelloDoc* GetDocument() 的一些问题 ?
    VC++错误 'OnLButtonDown' : member function not declared in 'CYx2_31View'
    Android中利用LinearLayout继承实现ImageButton 转
    ID 指针 句柄
    句柄和ID 指针与handle的区别
  • 原文地址:https://www.cnblogs.com/aalex/p/4904569.html
Copyright © 2011-2022 走看看