LeetCode 543. 二叉树的直径 (任意两结点最长距离)
LeetCode :https://leetcode-cn.com/problems/diameter-of-binary-tree/
题目描述:
给定一棵二叉树,你需要计算它的直径长度。
一棵二叉树的直径长度是任意两个结点路径长度中的最大值。
提示:这条路径可能穿过也可能不穿过根结点。
示例:给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]
注意:两结点之间的路径长度是以它们之间边的数目表示。
解题思路:
给定一棵二叉树,求出树中任意两个结点距离的最大值。
首先明确距离最大的两个结点出现位置:
1)同时在根结点的左子树中 (图一)
2)同时在根结点的右子树中(图三)
3)左右子树中各有一个结点(图二)
假设我们分别得到了根结点左子树中两个结点最长距离,右子树中两个结点最长距离(这是求整棵树中两个结点最长距离的子问题罢了,既然程序能够求出整棵树两个结点最长距离,那么求左右子树中的最长距离只不过是两次递归调用而已),还要得到根结点左子树高度(最低层为0),这个高度代表左子树中最底层结点到根结点距离(图三),同样可以得到右子树高度。
将左子树两个结点最长距离,右结点两个结点最长距离,左、右子树高度之和比较,取得三者中的最大值,即为这棵二叉树中两个结点距离的最大值。
解法1:从根节点,依次递归遍历左右节点 (二叉树层次太深,有可能栈溢出)
使用递归进行求解,每次递归的过程中:
1)先求出以某个节点为树根的二叉树的左子树的最长深度 leftHigh、右子树的最长深度rightHigh
2)然后在递归函数中,用一个变量max来保存任意两个节点间的最长路径。
3)在求出左子树的最长深度 leftHigh 和右子树的最长深度 rightHigh 之后,就可以求出以该节点为根的二叉树的最长路径max。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { private int max = 0; // 全局变量, 保存最长边数 public int diameterOfBinaryTree(TreeNode root) { if(root == null) return 0; // 根节点为空 // 另起二叉树递归函数, 不能在本函数递归, 因为无法返回最大值max binaryTreeMaxHight(root); return max; } private int binaryTreeMaxHight(TreeNode root) { // 2. 左右子节点的递归返回条件 if(root == null) return 0; // 1. 遍历左右子节点, 并求边数 int leftHight = binaryTreeMaxHight(root.left); int rightHigh = binaryTreeMaxHight(root.right); // 3. 更新根节点边数的最大值 if(leftHight + rightHigh > max) { max = leftHight + rightHigh; } // 4. 左右叶节点加1, 计算叶节点的边数 return Math.max(leftHight, rightHigh) + 1; } }
参考推荐:
LeetCode 543. 二叉树的直径 (任意两结点最长距离)
Python 常用加密算法 base64, md5, sha1
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2021-02-05 19:19:01
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!