求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数, 比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

一种是:经过根节点,此时只需要求出左右子树的最大深度就可以

另一种:不经过根节点,此时需要递归求解左右子树,然后比较左右子树中最大距离,求大者

  1  #include "stdio.h"
  2  #include"stdlib.h"
  3  struct NODE
  4     {
  5          NODE* pLeft;            // 左子树
  6          NODE* pRight;          // 右子树
  7          int nMaxLeft;          // 左子树中的最长距离
  8          int nMaxRight;         // 右子树中的最长距离
  9          int chValue;        // 该节点的值
 10     };
 11
 12     int nMaxLen = 0;
 13
 14     // 寻找树中最长的两段距离
 15     void FindMaxLen(NODE* pRoot)
 16     {
 17          // 遍历到叶子节点,返回
 18          if(pRoot == NULL)
 19               return;
 20
 21          // 如果左子树为空,那么该节点的左边最长距离为0
 22          if(pRoot -> pLeft == NULL)
 23               pRoot -> nMaxLeft = 0;
 24
 25
 26          // 如果右子树为空,那么该节点的右边最长距离为0
 27          if(pRoot -> pRight == NULL)
 28               pRoot -> nMaxRight = 0;
 29
 30
 31          // 如果左子树不为空,递归寻找左子树最长距离
 32          if(pRoot -> pLeft != NULL)
 33               FindMaxLen(pRoot -> pLeft);
 34
 35
 36          // 如果右子树不为空,递归寻找右子树最长距离
 37          if(pRoot -> pRight != NULL)
 38               FindMaxLen(pRoot -> pRight);
 39
 40
 41          // 计算左子树最长节点距离
 42          if(pRoot -> pLeft != NULL)
 43          {
 44               int nTempMax = 0;
 45               if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight)
 46               {
 47                    nTempMax = pRoot -> pLeft -> nMaxLeft;
 48               }
 49               else
 50               {
 51                    nTempMax = pRoot -> pLeft -> nMaxRight;
 52               }
 53               pRoot -> nMaxLeft = nTempMax + 1;
 54          }
 55
 56          // 计算右子树最长节点距离
 57          if(pRoot -> pRight != NULL)
 58          {
 59               int nTempMax = 0;
 60               if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight)
 61               {
 62                    nTempMax = pRoot -> pRight -> nMaxLeft;
 63               }
 64               else
 65               {
 66                    nTempMax = pRoot -> pRight -> nMaxRight;
 67               }
 68               pRoot -> nMaxRight = nTempMax + 1;
 69          }
 70
 71          // 更新最长距离
 72          if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen)
 73          {
 74               nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;
 75          }
 76      }
 77
 78 NODE *createTree()
 79 {
 80     NODE *root;
 81     int data;
 82     printf("input data:");
 83     scanf("%d",&data);
 84     //printf("output data:%d\n",data);
 85
 86     if(data==0)
 87       root=NULL;
 88     else/*根左右 前序建立二叉树*/
 89     {
 90         root=(NODE*)malloc(sizeof(NODE));
 91         root->chValue=data;
 92         root->pLeft=createTree();
 93         root->pRight=createTree();
 94     }
 95     return root;
 96 }
 97 int main()
 98 {
 99     NODE  *root;
100     root=createTree();
101     FindMaxLen(root);
102
103     printf("%d",nMaxLen);
104     return 0;
105 }

转载于:https://www.cnblogs.com/WayneZeng/archive/2013/04/21/3034187.html

【IT笔试面试题整理】 二叉树任意两个节点间最大距离相关推荐

  1. 【算法系列之十三】二叉树两叶节点的最大距离

    1.题目描述     给定一棵二叉树,计算这课二叉树的直径长度,即为二叉树任意两个节点间的最长路径.比如: 这棵二叉树的最长路径为3. 2.解题思路     使用递归进行求解,每次递归的过程中,先求出 ...

  2. 【IT笔试面试题整理】寻找二叉树两节点的最近的公共祖先

    [试题描述] 求二叉树中任意两个节点的最近公共祖先也称为LCA问题(Lowest Common Ancestor). 二叉查找树 如果该二叉树是二叉查找树,那么求解LCA十分简单. 基本思想为:从树根 ...

  3. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)

    题目: 给定一颗二叉树,找到二叉树上任意两个节点之间的距离 class TreeNode {TreeNode left;TreeNode right;} 思路: 首先找到一个节点的路径,然后找到另一个 ...

  4. 二叉树任意两节点之间的最短距离

    public class 二叉树任意两节点之间的路径 {public static void main(String[] args) {TreeNode node = new TreeNode(1); ...

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

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

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

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

  7. 学校的校园景点平面图(校园景点迷你地图C++数据结构)(查询图中顶点间的最短路径查询图中任意两个顶点间的所有路径)

    学校的校园景点平面图(校园景点迷你地图C++&数据结构) 设计要求: (1)建图 以图中顶点表示主要景点,并存放景点的编号.名称.简介等信息: (2)查询 该系统可以查询景点的信息: 查询图中 ...

  8. zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间

    zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间之前的博文 使用zabbix3.0.4的ICMP ...

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

    一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离.所以给想借机写一篇博客. 在开始之前,我们先想想,两个最常节点的最远距离是怎么样的? 情况一:最大距离可能一个在左子树,一 ...

最新文章

  1. AlphaGo之后,DeepMind重磅推出AlphaFold:基因序列预测蛋白质结构
  2. 【alibaba-cloud】SpringCloud和SpringCloud对比
  3. 图解当前最强语言模型BERT:NLP是如何攻克迁移学习的?
  4. 今日头条架构演进之路——高压下的架构演进专题
  5. 用jquery给Struts2的s:radio /标签添加change事件
  6. 再谈贝叶斯学派与频率学派的区别
  7. [NAACL19]一个更好更快更强的序列标注成分句法分析器
  8. python注释中文_python注释不能识别中文
  9. Hive窗口函数之preceding and following
  10. ROTATED REGION BASED CNN FOR SHIP DETECTION 基于旋转区域的CNN舰船检测
  11. FC6下的ftp服务和telnet服务安装
  12. 【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)
  13. 国产手机设计业遭遇拐点 萧条期寻觅突围路
  14. java猜单词游戏_Java_初级编程,猜英文单词游戏
  15. Java故事之路在脚下
  16. 关于Oracle执行sql语句报错[ORA-01722: invalid number]无效数字解决思路
  17. 逆变电源于滤波电感器
  18. 网络投票器软件摄影投票比赛链接制作手机制作投票链接手机投票
  19. 2345王牌输入法的卸载
  20. 【漏网之鱼】Ansible AWX调用playbook传参问题

热门文章

  1. 【聊透SpringMVC】自学java和三大框架要多久
  2. 【深夜思考】java百度云资源
  3. 【408预推免复习】计算机组成原理之CPU的结构和功能
  4. 【PAT (Advanced Level) Practice】1124 Raffle for Weibo Followers (20 分)
  5. ai3中文语音补丁_NS 暗黑破坏神3 中文补丁今日上线!刷起来
  6. html响应式导航栏制作,用Sass制作响应式导航栏(原创)
  7. sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?
  8. 网站地图对优化的优势有哪些?
  9. php关于路由,PHP URL路由类实例
  10. python字符串大写字母个数_python判断字符串是字母 数字 大小写(转载)