zoukankan      html  css  js  c++  java
  • 求二叉树中节点的最大距离

    如果我们把二叉树视为一个图,父子几点之间的连线视为是双向的,我们可以把“距离”定义为来两结点之间边的个数。

    计算一个二叉树的最大距离有两种情况:
    情况A:路径经过左子树,通过根节点,再到右子树饿最深节点。
    情况B:路径不经过根节点,而是左子树或者右子树的最大距离路径,取其大者。
    只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距离。

    代码如下:

     1 typedef struct BTNode
     2 {
     3     int data;
     4     BTNode * lc;
     5     BTNode * rc;
     6 }BTNode,*BinTree;
     7 
     8 typedef struct RESULT
     9 {
    10     int nMaxDistance;
    11     int nMaxDepth;
    12 }RESULT;
    13 
    14 //算法函数
    15 RESULT getMaxDistance(NODE *node)
    16 {
    17     if(!node)//递归到最大深度才进行初始化
    18     {
    19         RESULT empty = {0,-1};
    20         return empty;
    21     }
    22     //对左右子树进行递归遍历
    23     RESULT lhs=getMaxDistance(node->lc);
    24     RESULT lhs=getMaxDistance(node->rc);
    25     RESULT result;
    26     result.nMaxDepth = max(lhs.nMaxDepth+1,rhs.nMaxDepth+1);//加1,因为连接到根节点
    27     result.nMaxDistance=max(max(lhs.nMaxDistance,rhs.nMaxDistance),lhs.nMaxDepth+1+rhs.nMaxDepth+1);
    28     return result;
    29 }

    为了减少NULL的条件测试,进入函数时,如果结点为NULL,会传回empty变量。其中将empty.nMaxDepth初始化为-1,目的是让调用方+1后,把无子树结点的最大深度置为0。

  • 相关阅读:
    逻辑卷扩容
    iptables网络防火墙||SNAT,DNAT等转发路由动作
    常用rman操作语句
    常用Oracle的SQL语句
    oracle中的单引号和双竖线||以及q'间隔符
    网站升级HTTPS教程
    站长必备:网站被黑后怎么快速搞定
    常见HTTP错误代码
    在Android中实现一个简易的Http服务器
    Android开发新手常见的10个误区
  • 原文地址:https://www.cnblogs.com/houjun/p/4860832.html
Copyright © 2011-2022 走看看