二叉树最长距离

tag: 二叉树

思路:

最长距离一定是两个叶子节点之间的距离

=> 两个叶子节点必定以某个节点为根节点

=> 因此用DFS思路自底向上计算经过每一个节点的最长距离,取其最大值

以每个节点为根节点的最长距离 = 左子树的高度+右子树的高度

package com.zhaochao.tree;

/**
 * Created by zhaochao on 17/1/25.
 */
public class MaxDistanceOfBT {

    int max = 0;
    public int maxDistance(TreeNode root) {
        if(root == null) {
            return 0;
        }
        if(root.left == null && root.right == null) {
            return 0;
        }
        //双枝
        max = Math.max(getHeight(root.left) + getHeight(root.right),max);
        //返回单枝
        return Math.max(getHeight(root.left),getHeight(root.right));
    }

    public int getHeight(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = getHeight(root.left);
        int right = getHeight(root.right);
        return Math.max(left, right) + 1;
    }

    public static void main(String[] args) {

        TreeNode root = new TreeNode(0);
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(3);
        TreeNode node5 = new TreeNode(3);
        TreeNode node6 = new TreeNode(3);
        TreeNode node7 = new TreeNode(3);
        TreeNode node8 = new TreeNode(3);
        TreeNode node9 = new TreeNode(3);

        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node3.left = node8;
        node8.left = node9;
        node1.right = node5;
        node5.right = node6;
        node2.right = node4;

        MaxDistanceOfBT test = new MaxDistanceOfBT();

        test.maxDistance(root);
        System.out.println(test.max);

    }

}

  

时间: 2024-07-29 08:15:11

二叉树最长距离的相关文章

求二叉树中节点的最长距离

分两种:①最长距离时候经过root ②最长距离不经过root, 1.      若路径经过根Root,则U和V是属于不同子树的,且它们都是该子树中道根节点最远的节点,否则跟它们的距离最远相矛盾.这种情况如图3-13所示: 2.      如果路径不经过Root,那么它们一定属于根的K个子树之一.并且它们也是该子树中相距最远的两个顶点.如图3-14中的节点A: 设第K棵子树中相距最远的两个节点:Uk和Vk,其距离定义为d(Uk,Vk),那么节点Uk或Vk即为子树K到根节点Rk距离最长的节点.不失一

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

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 计算一个二叉树的最大距离有两个情况: 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 思路: 1,后序遍历每一节点,找出该节点到最右边的距离以及最左边的距离: 2,找到之和最大的即可. //需保存左子树中最长距离.右子树最长

编程之美3.8 求二叉树中节点的最大距离

描述:如果把二叉树看成一个图,父子节点之间的连线看成双向的,定义“距离”为两个节点之间边的个数.求二叉树中相距最远的两个节点的距离. 思路:相距最远的两个节点一定是叶子节点,且这两个叶子节点的路径有两种情况: 1. 该路径经过root节点,则两个叶子节点分属root.left和root.right为根的子树,而且是两个子树中距离root.left和root.right最远的叶子节点: 2. 该路径不经过root节点,则这两个叶子节点的root.left或root.right上: 根据以上分析,参

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

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点

编程之美---求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 解法:用递归的方法 1 // 数据结构定义 2 struct NODE 3 { 4 NODE* pLeft; // 左子树 5 NODE* pRight; // 右子树 6 int nMaxLeft; // 左子树中的最长距离 7 int nMaxRight; // 右子树中的最长距离 8 char chValue; // 该节点

编程之美——二叉树中节点间最大距离

关于递归程序: 递归程序结构包括三部分:递归出口.逻辑处理(需要处理的问题).递归调用(衔接). 通过递归调用将问题转化为对子问题的解决,通过回溯完成原问题的解答: 递归与数学归纳法:递归是数学归纳法在计算机程序中的体现.使用递归思想设计程序时,我们设置base case,并假设我们会获得n-1的结果,并实现n的结果.这就好像数学归纳法,我们只关注初始和衔接,而不需要关注具体的每一步. 当问题采用递归算法求解时,代码如下: 1 #include<iostream> 2 #include<

二叉树节点的最大距离

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 书上的解法 书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述. 计算一个二叉树的最大距离有两个情况: 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距

算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最大搜索二叉子树是什么.答案一定在其中 第一步,列出可能性(最难部分) 1.可能来自左子树上的某课子树 2.可能来自右子树上的某课子树 3.整颗都是(左右子树都是搜索二叉树并且左子树最大小于该节点,右子树最小大于该节点) 第二步,收集信息: 1.左树最大搜索子树大小 2.右树最大搜索子树大小 3.左树

C#实现二叉树的遍历

C#实现二叉树的前序.中序.后序遍历. public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;         /// <summary>         /// 前序遍历         /// </summary>         /// <param name="tree">&l