一,题目:

       如果把二叉树看成一个图,父子节点之间的连线看成是双向的(无向图),定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。

二,思路

       误导思路:不要以为求树的高度。

       正确思路:求“图”中任意两个节点之间,相距最远的的两个节点之间的距离。

       求解步骤:A,经过根节点,左边最深的点到右边最深的点的距离。

                          B,不经过根节点,而是左子树或右子树中最大距离,取其大者。

三,图解

情况A:                                                   情况B:

                            A                                                                A

                        /       \                                                         /        \

                      B        C                                                    B            O

                    /    \     /    \                                                /     \

                 D     E   F     G                                          C         D

    /             \

                                                                               E                F

                                                                             /                      \

                                                                         G                           H 

情况A:最大距离经过顶点D-B-A-C-F(其中之一)

情况B:最大距离不经过顶点G-E-C-B-D-F-H(其中之一)

四,源码

#include "stdio.h" #include"stdlib.h" struct NODE { NODE* pLeft; // 左子树 NODE* pRight; // 右子树 int nMaxLeft; // 左子树中的最长距离 int nMaxRight; // 右子树中的最长距离 int chValue; // 该节点的值 }; int nMaxLen = 0; // 寻找树中最长的两段距离 void FindMaxLen(NODE* pRoot) { // 遍历到叶子节点,返回 if(pRoot == NULL) return; // 如果左子树为空,那么该节点的左边最长距离为0 if(pRoot -> pLeft == NULL) pRoot -> nMaxLeft = 0; // 如果右子树为空,那么该节点的右边最长距离为0 if(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; } } NODE *createTree() { NODE *root; int data; printf("input data:"); scanf("%d",&data); //printf("output data:%d\n",data); if(data==0) root=NULL; else/*根左右 前序建立二叉树*/ { root=(NODE*)malloc(sizeof(NODE)); root->chValue=data; root->pLeft=createTree(); root->pRight=createTree(); } return root; } int main() { NODE *root; root=createTree(); FindMaxLen(root); printf("%d",nMaxLen); return 0; }

转载于:https://www.cnblogs.com/JPAORM/archive/2011/12/25/2510057.html

【100题】第十一题(二叉树中节点的最大距离)相关推荐

  1. 【编程题目】求二叉树中节点的最大距离

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

  2. c++实现二叉树中节点的最大距离 - c++语言程序开发技术文章,c++实现二叉树中节点的最大距离...

    文章前半部分能懂,可是后面的Milo不是很理解,可能有待以后学习..... 微软面试题之一,难度系数中,题目描述如下: 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看 ...

  3. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法

    问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...

  4. 求二叉树中节点的最大距离

    struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chVa ...

  5. 编程之美-求二叉树中节点的最大距离方法整理

    [试题描述] 方法:

  6. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 8 二叉树中序遍历的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注 ...

  7. 【LeetCode 每日一题】1617. 统计子树中城市之间最大距离(hard)

    1617. 统计子树中城市之间最大距离   图论啊,那我先寄为敬.今天是代码搬运工.   题意很好理解啊,就是给你一个图,让你返回所有直径对应的子树的数量.是的没错,是所有直径,你不仅要枚举 1 − ...

  8. 二叉树中节点的最大的距离(编程之美3.8)

    问题来源:<编程之美>3.8 求二叉树节点的最大距离 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数. 写一个程序求一 ...

  9. Leetcode每日一题:all-nodes-distance-k-in-binary-tree(二叉树中所有距离为K的节点)

    思路:主要就是用DFS做当前节点和父节点的映射,这样就能在target节点BFS的形式处发散出去:其次,为了防止发散过程中重复遍历某个节点,设定set或者map,对里面已存放的节点不加遍历:有时候做题 ...

最新文章

  1. 一种集各种优点于一身的技术面试方式--转
  2. 153是一个非常特殊的数,它等于它的每位数字的立方和
  3. iOS键盘弹出通知后加入动画
  4. bootstrap table 表格支持shirt 多选_bootstrap-table 表格行内编辑实现
  5. Myeclipse学习总结(15)——Eclipse/MyEclipse中Maven项目常见问题解决汇总
  6. NRF52840学习——GPIO输入,实现按键短按和长按
  7. Ubuntu 20.04 虚拟机镜像源更改
  8. SCTP客户/服务器程序
  9. 手机APP测试,个人整理(Android和IOS)
  10. VC++通过MSXML6来操作xml需要注意的内存泄漏问题
  11. 我努力了18年,不是为了和你一起喝咖啡姐妹篇
  12. 软件人才应具备的五种素质
  13. 天堂2java报错_那位高手帮我解决一下天堂2单机的服务器问题
  14. 看看中国科技巨头们在智能音箱行业的竞争
  15. python字母表_Python 一句话生成字母表的方法
  16. Python实现邮箱自动群发工资条
  17. 【Solidity】注意事项
  18. 如何查询微博主页地址是什么?
  19. 计算多列迭代次数的一种平均列近似方法
  20. C#ListView操作一二

热门文章

  1. Mysql 存储过程基本语法
  2. $《第一行代码:Android》读书笔记——第6章 数据持久化
  3. Coin-row problem(1139)
  4. PAT-BASIC-1003-我要通过!
  5. Java多线程、主线程等待所有子线程执行完毕、共享资源
  6. SQL语句将表中数据导入到另一个数据库表中
  7. asp.net中使用excel类导出Excel文件,并导出到web客户端中遇到的问题
  8. dao-service-servlet-jsp构建简易web通讯录(三层开发)bug1
  9. 安装独立版本的 Adobe Community Help
  10. java list 效率_Java中5种List的去重方法及它们的效率对比,你用对了吗?