一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离。所以给想借机写一篇博客。

在开始之前,我们先想想,两个最常节点的最远距离是怎么样的?

情况一:最大距离可能一个在左子树,一个在右子树中,通过根节点;

情况二:也可能出现在左/右子树中,不经过根节点。

大体就是这样,我们要如何来解决呢?

给大家看看《编程之美》中它是如何决解的:

<span style="font-size:24px;">// 数据结构定义
struct NODE
{NODE* pLeft;        // 左子树NODE* pRight;       // 右子树int nMaxLeft;       // 左子树中的最长距离int nMaxRight;      // 右子树中的最长距离char chValue;       // 该节点的值
};int nMaxLen = 0;// 寻找树中最长的两段距离
void FindMaxLen(NODE* pRoot)
{// 遍历到叶子节点,返回if(pRoot == NULL){return;}// 如果左子树为空,那么该节点的左边最长距离为0if(pRoot -> pLeft == NULL){pRoot -> nMaxLeft = 0; }// 如果右子树为空,那么该节点的右边最长距离为0if(pRoot -> pRight == NULL){pRoot -> nMaxRight = 0;}// 如果左子树不为空,递归寻找左子树最长距离if(pRoot -> pLeft != NULL){FindMaxLen(pRoot -> pLeft);}// 如果右子树不为空,递归寻找右子树最长距离if(pRoot -> pRight != NULL){FindMaxLen(pRoot -> pRight);}// 计算左子树最长节点距离if(pRoot -> pLeft != NULL){int nTempMax = 0;if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight){nTempMax = pRoot -> pLeft -> nMaxLeft;}else{nTempMax = pRoot -> pLeft -> nMaxRight;}pRoot -> nMaxLeft = nTempMax + 1;}// 计算右子树最长节点距离if(pRoot -> pRight != NULL){int nTempMax = 0;if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight){nTempMax = pRoot -> pRight -> nMaxLeft;}else{nTempMax = pRoot -> pRight -> nMaxRight;}pRoot -> nMaxRight = nTempMax + 1;}// 更新最长距离if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen){nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;}
}</span>

这段代码有几个缺点:
1.算法加入了侵入式(intrusive)的资料nMaxLeft, nMaxRight
2.使用了全局变量 nMaxLen。每次使用要额外初始化。而且就算是不同的独立资料,也不能在多个线程使用这个函数
3.逻辑比较复杂,也有许多 NULL 相关的条件测试。

而,我想了想,写出了这样的代码:

<span style="font-size:24px;">void _FindMaxDis(BSTreeNode *pNode, int &deepth, int &maxdis)    //这里的两个数,我都用的是引用,读者知道为什么?
{  if (pNode==NULL)  {  deepth=0;maxdis=0;  return;  } </span>
<span style="font-size:24px;">    int l_deepth=0,r_deepth=0;  int l_maxdis=0,r_maxdis=0;  if (pNode->m_pleft)  FindMaxDis(pNode->m_pleft,l_deepth,l_maxdis);  if (pNode->m_pright)  FindMaxDis(pNode->m_pright,r_deepth,r_maxdis);  deepth = (l_deepth > r_deepth ? l_deepth : r_deepth) + 1;  maxdis = l_maxdis > r_maxdis ? l_maxdis : r_maxdis ;  maxdis = (l_deepth+r_deepth) > maxdis ? (l_deepth+r_deepth) : maxdis;  }</span>
<span style="font-size:24px;">
int FindMaxDis(BSTreeNode *pNode)
{  int deepth, maxdis;  _FindMaxDis(pNode,deepth,maxdis);  return maxdis;
}  </span>

其实做做这个题,大体思路都是一致的。但是,我们要考虑很多。在这个方面,推荐读者去看看《代码大全》

我来说一说这个代码的好处吧。

提高了可读性,另一个优点是减少了 O(节点数目) 大小的侵入式资料,而改为使用 O(树的最大深度) 大小的栈空间。

本博文只是对二叉树中两个节点最远的距离的解法,做了粗略的概述,如有更好的解法或者不同的看法,请留言。

求二叉树中两个节点最远的距离相关推荐

  1. 剑指offer之求二叉树中两个节点的最低共同父节点

    1 问题 求二叉树中俩个节点的最低共同父节点,比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父 ...

  2. 求二叉树中两个节点的最远距离

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

  3. 二叉树两节点距离java,求二叉树中两个节点的最远距离

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

  4. 求一颗二叉树中两个节点的最低公共父节点

    题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...

  5. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)

    这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...

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

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

  7. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点

    这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...

  8. 判断二叉树中两个节点的最低共同父节点

    只要找到这样一个节点: 已知的两个节点一个在它的左边子树,一个在它的右边子树: 或者这个节点就是已知的两个节点中的一个,而另一个恰好在它的下面. TREE* CommonFather(TREE *ro ...

  9. 树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?

    小编典典 尼克·约翰逊是正确的,一个一个O(n)的时间复杂度算法是最好的,如果你没有父指针,你可以做.)对于算法的一个简单的递归版本中看到代码金丁的职务)它运行在O(n)的时间. 但是请记住,如果您的 ...

最新文章

  1. python【力扣LeetCode算法题库】55-跳跃游戏
  2. flask 返回html json 并让ios 安卓接收
  3. java创建指定日期_如何创建指定的日期和时间
  4. 一文带你了解华为云DevCloud为何能全面领跑中国DevOps云服务市场
  5. “精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面
  6. dbms_排名前50位的DBMS面试问答
  7. Spring中监听器的详解
  8. 春招妥了!资深技术面试官教你这样准备 Java 面试! | CSDN 博文精选
  9. opencv 凸包讲解和绘制
  10. 如何找出php木马,linux下查找php木马
  11. winHex创建指定大小二进制文件.bin(数据为全0或全FF或自己填充)并带winHex软件下载包
  12. 用计算机就行DNA翻译的程序,南邮通达科技英语原文翻译Lession 2 CTEXT
  13. HDFS与HBASE的动态节点的扩容(增删)小白级(二)
  14. 前端移动端几个组件库
  15. JSP水电费管理系统myeclipse开发mysql数据库web结构java编程
  16. 【Simulia】 Lsight多学科仿真流程 | 达索系统百世慧®
  17. it技术交流社区与学习资料的网站大全
  18. Ruby学习记录 - 安装Ruby
  19. 一文让你吃透!图解 pandas 透视表、交叉表!
  20. 卷积神经网络发展(网络骨架:Backbone)

热门文章

  1. python 逗号作用 语句间_Python中的逗号有什么作用?
  2. android华为怎么截屏快捷键,华为P9怎么截图 三种华为P9手机截屏方法图解
  3. tar 解压,重命名
  4. android 小视频 应用,心意短视频安卓,心意短视频安卓客户端app软件预约 v1.0-手游汇...
  5. Hadoop_HDFS的读写流程
  6. 陪孩子一起学python第二季_陪伴的句子
  7. 炫舞卡在正在连接服务器,《QQ炫舞》手游无法连接版本服务器怎么办 服务器断连恢复方法...
  8. Python标准库之pickle
  9. 高效交易连接器,MallBook产品顾问如何看待分账系统对交易数字化的作用
  10. lol8月21号服务器维护,《LOL》8月21日测试服 更新维护内容