二叉树结点最远距离

来源:互联网 发布:强力卸载软件 编辑:程序博客网 时间:2024/06/05 04:21

题目

给定二叉树,求取该二叉树多有节点中距离最远的结点相隔的距离

分析

以root为根节点的树上,最大距离求取
情况一:root的左子树上的最大距离
情况二:root的右子树上的最大距离
情况三:root左子树上距离root结点最远的距离,加上root自身这个节点,再加上root右子树上距离root右孩子最远的距离
三个值中最大的即为所求

思路

1、整个过程为后序遍历,在二叉树的每棵子树上指向步骤2
2、假设子树头root,处理root的左子树,得到两个信息,左子树上的最大距离记为LMax1,左子树上距离root左孩子的最远距离记为LMax2。处理root右子树得到右子树上的最大距离记为RMax1,距离root右孩子的最远距离记为RMax2。那么跨root结点情况下的最大距离为LMax2+1+RMax2,这个值与LMax1和RMax1比较,最大值即为所求
3、LMax2+1就是root左子树上距离root最远的点到root的距离
RMax2+1就是root右子树上距离root最远的点到root的距离
两者中最大的一个作为root树上距离root最远的距离返回
4、用返回长度为2的数组的方式,可以做到返回两个值

代码实现

/** * 从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当 * 到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。 * 给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500. */private static class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}private static int findLongest(TreeNode root) {    // write code here    int[] res = new int[1];    return findLongestCore(root, res);}private static int findLongestCore(TreeNode node, int[] res) {    if (node == null) {        res[0] = 0;        return 0;    }    int LMax = findLongestCore(node.left, res);//当前节点左子树上距离当前结点左孩子的最远距离    int maxLeftChild = res[0];//当前结点左子树上距离当前节点最远的距离(不包括当前节点自身)    int RMax = findLongestCore(node.right, res);//当前节点右子树上距离当前结点右孩子的最远距离    int maxRightChild = res[0];//当前结点左子树距离当前节点最远的距离(不包括当前节点自身)    res[0] = Math.max(maxLeftChild + 1, maxRightChild + 1);//当前结点的子树距离当前结点的最远距离(包括当前结点)    return Math.max(Math.max(LMax, RMax), maxLeftChild + maxRightChild + 1);}


原创粉丝点击