算法—leetcode—543

236 阅读2分钟

题目

  1. 二叉树的直径

题目描述

给定一棵二叉树,你需要计算它的直径长度;一棵二叉树的直径长度是任意两个结点路径长度中的最大值;这条路径可能穿过也可能不穿过根结点。

路径的长度

一条路径的长度为该路径经过的节点减一

思路

二叉树的直径(即求路径长度的最大值)等效于求路径经过节点树的最大值减一

以一个节点的为起点的路径经过节点的最大数值,是左子数经过的节点值+右子数经过的节点值+1
一颗树的路径经过节点的最大值,是所有子数中路径经过节点的最大值

1.主要是思路是通过后续遍历,求每个节点路径所经过的节点最大值
2.定义一个变量保存当前最大值,与每个节点所求的最大值做对比 3.最终最大值-1即为二叉树的直径

深度优先搜索

示例

二叉树
data := &TreeNode{
	Val:1,
	Left:&TreeNode{
		Val:2,
		Left:&TreeNode{Val:4},
		Right:&TreeNode{Val:5}
	},
	Right:&TreeNode{Val:3}
}

返回3,它的长度是路径[4,2,1,3]或[5,2,1,3]

代码

package leetcode

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// diameterOfBinaryTree
// 二叉树的直径
func diameterOfBinaryTree(root *TreeNode) int {
	var maxPath int
	
	// 后续遍历二叉树
	var postOrder func(root *TreeNode) int
	postOrder = func(root *TreeNode) int {
		if root == nil{
			return 0
		}
		// 左右子数的最大节点数
		leftLen := postOrder(root.Left)
		rightLen := postOrder(root.Right)
		// 当前节点最大节点数与当前最大节点树对别
		maxPath = max(maxPath, leftLen+rightLen+1)
		return max(leftLen, rightLen)+1
	}
	
	postOrder(root)
	// 一条路径的长度为该路径经过的节点减一
	if maxPath==0 {
		return 0
	}
	return maxPath-1
}

// max
// 求两个数的最大值
func max(left, right int)int{
	if left>right{
		return left
	}
	return right
}

参考

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/di…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。