104.二叉树的最大深度
104.二叉树的最大深度
思路
三行手撕。
递归。
递归三要素:
确定递归函数的参数和返回值:参数:根节点,返回值以该根节点为树的深度
确定终止条件: 根节点为nIl,直接返回0,深度为0
确定单层递归的逻辑: 将左右节点的最大深度相比取最大值然后加1,也就是当前节点的最大深度。
时间复杂度On
空间复杂度Oh
代码
func maxDepth(root *TreeNode) int {
if root==nil{
return 0
}
return 1+max(maxDepth(root.Left),maxDepth(root.Right))
}
func max(i,j int) int{
if i<j{
return j
}else{
return i
}
}
559.n叉树的最大深度
思路
与上题一样
代码
func maxDepth(root *Node) int {
if root==nil{
return 0
}
res:=0
for _,v:=range root.Children{
res=max(res,maxDepth(v))
}
return 1+res
}
func max(i,j int)int{
if i<j{
return j
}else{
return i
}
}
111.二叉树的最小深度
思路
递归。
时间复杂度On
空间复杂度Oh
代码
func minDepth(root *TreeNode) int {
if root==nil{
return 0
}
res:=math.MaxInt32
if root.Left!=nil||root.Right!=nil{
if root.Left!=nil{
res=min(res,minDepth(root.Left))
}
if root.Right!=nil{
res=min(res,minDepth(root.Right))
}
}else{
res=0
}
return 1+res
}
func min(i,j int)int{
if i<j{
return i
}else{
return j
}
}
困难
注意只要求到叶子节点,所以递归的时候判断如果子树为nil,就不进行递归。在判断外部记录结果(足够大的值),进到递归后更新这个值。最后如果都不进行递归说明没有左右子树,这时候才可以判断其子树的最小深度为0。
222.完全二叉树的节点个数
思路
因为树已经是完全二叉树了
递归根据这个条件,先判断左右子节点是否是完全二叉树,是的话用公式计算2^h-1
时间复杂度Ologn*Ologn
代码
func countNodes(root *TreeNode) int {
if root==nil{
return 0
}
lh,rh:=0,0
cl,cr:=root.Left,root.Right
for cl!=nil{
cl=cl.Left
lh++
}
for cr!=nil{
cr=cr.Right
rh++
}
if lh==rh{
return (2<<lh)-1
}
return 1+countNodes(root.Left)+countNodes(root.Right)
}
困难
根据完全二叉树的条件写递归终止的逻辑。
今日收获
对二叉树问题结合递归解法有了更深的了解。