/*求二叉树中距离最远的两个点* 基本思路:* 递归计算两棵树的最大高度,设置一个全局变量,距离最远的两个节点element* 其中:在计算左子支,直接刷新上述全局变量,在计算右边子支时,设置两个临时Node变量,变量里的element用于* 保存右边子支的两个最远距离。根据比较两个距离的大小、其父节点所在的树三个的大小,来重新刷新全局变量。* 一个Trick~:在计算子支的最远距离的时候,因为要和其父节点所在的树比较大小,保存子支的最大距离的点数。 */public class MaxLenTree {public Node root;public int len = 0;public class Node {char element;int hight;Node left;Node right;public Node(char element, int hight, Node left, Node right) {this.element = element;this.hight = hight;this.left = left;this.right = right;}Node() {}}MaxLenTree() {/*        Node e = new Node('e', 0, null, null);Node d = new Node('d', 0, e, null);Node f = new Node('f', 0, null, null);Node c = new Node('c', 0, d, f);Node b = new Node('b', 0, c, null);Node a = new Node('A', 0, b, null);*/Node m = new Node('m', 0, null, null);Node n = new Node('n', 0, null, null);Node k = new Node('k', 0, m, n);Node l = new Node('l', 0, null, null);Node i = new Node('i', 0, null, null);Node j = new Node('j', 0, k, l);Node q = new Node('q', 0, null, null);Node p = new Node('P', 0, q, null);Node h = new Node('h', 0, p, null);Node d = new Node('d', 0, h, null);Node e = new Node('e', 0, i, j);Node b = new Node('B', 0, d, e);Node f = new Node('f', 0, null, null);Node g = new Node('g', 0, null, null);Node c = new Node('c', 0, f, g);Node a = new Node('A', 0, b, c);root = a;}public static void main(String[] args) {MaxLenTree mTree = new MaxLenTree();mTree.calculateHight();mTree.run();}public void run() {Node node = new Node();System.out.println(findMaxLen(this.root, node));System.out.println("maxNode left.element---" + maxNodeleft.element);System.out.println("maxNoderight.element---" + maxNoderight.element);}public Node maxNodeleft = new Node();public Node maxNoderight = new Node();public int findMaxLen(Node root, Node LongestChild) {System.out.println(LongestChild.element);if (root.left == null && root.right == null) {LongestChild.element = root.element;maxNodeleft.element = root.element;maxNoderight.element = root.element;return 0;}Node leftLongestChild = new Node();Node rightLogestChild = new Node();if (root.left == null || root.right == null) {if (root.right == null) {int a = findMaxLen(root.left, leftLongestChild);System.out.println(leftLongestChild.element);if (hight(root) > a) {LongestChild.element = leftLongestChild.element;this.maxNodeleft.element = leftLongestChild.element;this.maxNoderight.element = root.element;return hight(root);} else {LongestChild.element = leftLongestChild.element;return a;}} else {int a = findMaxLen(root.right, rightLogestChild);if (hight(root) > a) {LongestChild.element = rightLogestChild.element;this.maxNodeleft.element = root.element;this.maxNoderight.element = rightLogestChild.element;return hight(root);} else {LongestChild.element = rightLogestChild.element;return a;}}}int a = findMaxLen(root.left, leftLongestChild);Node rightNodetempLeft = new Node();rightNodetempLeft.element = maxNodeleft.element;Node rightNodetempRight = new Node();rightNodetempRight.element = maxNoderight.element;int b = findMaxLen(root.right, rightLogestChild);int c = Math.max(a, b);if (a > b) {maxNodeleft.element = rightNodetempLeft.element;maxNoderight.element = rightNodetempRight.element;}if (c == b) {LongestChild.element = rightLogestChild.element;} else {LongestChild.element = leftLongestChild.element;}int d = hight(root.left) + hight(root.right) + 2;if (c < d) {maxNodeleft.element = leftLongestChild.element;maxNoderight.element = rightLogestChild.element;}System.out.println(LongestChild.element);return Math.max(c, d);}public int hight(Node root) {if (root == null) {return -1;}return root.hight;}public void showTree(Node root) {if (root == null) {return;}System.out.println(root.element + "<----->" + root.hight);showTree(root.left);showTree(root.right);}public void calculateHight() {calculateHight(this.root);}public int calculateHight(Node root) {if (root == null) {return -1;}if (root.right == null && root.left == null) {root.hight = 0;return 0;}int temp = Math.max(calculateHight(root.left),calculateHight(root.right)) + 1;root.hight = temp;return temp;}}

转载于:https://www.cnblogs.com/lisongfeng9213/p/3806484.html

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

  1. 【IT笔试面试题整理】 二叉树任意两个节点间最大距离

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

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

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

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

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

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

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

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

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

  6. java已知一个二叉树_大牛带你学 | 由二叉树的遍历序列求二叉树结构的解题方法归纳...

    前言 二叉树章节 属于数据结构考察的三大重点章节(线性表.树.图)之一,不管是在自命题院校考察和408统考都是考察频次很高的考点.今天,大牛学长就来为各位同学总结归纳一个二叉树知识考察中的常见题型的解 ...

  7. 二叉树——求两个节点的最近公共祖先

    题目 给定一颗二叉树的头结点,和这颗二叉树中2个节点n1和n2,求这两个节点的最近公共祖先: 思路 利用后序遍历实现: 对于当前节点cur,如果节点为null或者等于n1或n2中的一个,则直接返回cu ...

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

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

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

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

最新文章

  1. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)
  2. 怎样知道pip install 可以安装包的哪些版本
  3. php 实现 html转js
  4. angr学习笔记(11)(SimProcedure)
  5. 数据库隔离级别---MySQL的默认隔离级别就是Repeatable,Oracle默认Read committed,最高级别Serializable
  6. 深度学习(28)随机梯度下降六: 多输出感知机梯度
  7. windows的python切换环境_Windows下的python虚拟环境设置
  8. Jsoup从一个文件加载一个文档
  9. 通过动态获取cookie爬取国家企业信用信息公司系统
  10. 使你的MFC程序具有win7的透明立体风格
  11. 关闭进程_Xbox Game Bar重磅更新:可不离开游戏关闭系统进程
  12. 允许其他网络用户通过此计算机的internet连接来连_「Azure云」什么是Azure虚拟网络?...
  13. 计算机机房需求调查表,弱电工程设计流程及客户需求调研表
  14. python生成图文并茂的pdf--财务报表(三)--页面布局和排版
  15. microsoft excel使用技巧和问题解决
  16. 云麦体脂秤华为体脂秤_如果是一个真正的体脂秤就好了:华为智能体脂秤
  17. 一份思考—版本间共性问题提炼与控制
  18. 肯德基餐厅查询Python代码
  19. 白话空间统计之二十五:空间权重矩阵(一)点数据的空间关系(1)
  20. 最新易语言安卓逆向视频教程

热门文章

  1. dfs遍历和bfs遍历python_广度优先遍历(BFS)和深度优先遍历(DFS)
  2. 【干货下载】金融大数据专场沙龙内容分享
  3. 大数据和人工智能的关系,超全解析
  4. centos部署mysql5.6免安装版
  5. jenkins+testlink+python搭建自动化测试环境
  6. 关于maven仓库中的_remote.repositories
  7. Android动画 详解(一 补间动画)
  8. C语言库函数大全及应用实例十四
  9. nodejs实战案例(Express框架+mongoDB)——(1)——前言
  10. 究竟是什么在影响着我?