赞
踩
最大深度:根节点到最远叶子节点的最长路径上的节点个数
(1)递归:max(左子树高度,右子树高度)+ 1
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}
(2)层序遍历:创建辅助队列
func maxDepth(root *TreeNode) int { if root == nil { return 0 } depth := 0 curQueue := []*TreeNode{root} for len(curQueue) > 0 { nextQueue := []*TreeNode{} for _, node := range curQueue { if node.Left != nil { nextQueue = append(nextQueue, node.Left) } if node.Right != nil { nextQueue = append(nextQueue, node.Right) } } depth++ curQueue = nextQueue } return depth }
只能说与二叉树模板一样
(1)递归:所有孩子节点子树的最大高度+1
func maxDepth(root *Node) int {
if root == nil {
return 0
}
depth := 0
for _, child := range root.Children {
if childDepth := maxDepth(child); childDepth > depth {
depth = childDepth
}
}
return depth + 1
}
(2)层序遍历
func maxDepth(root *Node) int { if root == nil { return 0 } depth := 0 curQueue := []*Node{root} for len(curQueue) > 0 { nextQueue := []*Node{} for _, node := range curQueue { if node.Children != nil { for _, child := range node.Children { nextQueue = append(nextQueue, child) } } } depth++ curQueue = nextQueue } return depth }
最小深度:根节点到最近叶子节点的最短路径上的节点个数
左右子树同时为空时候的节点高度的最小值 + 1
(1)递归
若左、右子树有一个为空,则返回不为空的子树的最小深度;若都不为空,返回左右子树中最小深度
func minDepth(root *TreeNode) int {
if root == nil {
return 0
}
if root.Left != nil && root.Right == nil {
return 1 + minDepth(root.Left)
}
if root.Right != nil && root.Left == nil {
return 1 + minDepth(root.Right)
}
return min(minDepth(root.Left),minDepth(root.Right)) + 1
}
(2)层序遍历
若该层节点存在左右子树都为空,返回深度,否则继续遍历
func minDepth(root *TreeNode) int { depth := 0 if root == nil { return depth } curQueue := []*TreeNode{root} for len(curQueue) > 0 { depth++ nextQueue := []*TreeNode{} for _, node := range curQueue { if node.Left == nil && node.Right == nil { return depth } if node.Left != nil { nextQueue = append(nextQueue, node.Left) } if node.Right != nil { nextQueue = append(nextQueue, node.Right) } } curQueue = nextQueue } return depth }
(1)递归:和求最大深度方法一样。【左右子树高度最大】【左右子树节点数和】
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
return countNodes(root.Left) + countNodes(root.Right) + 1
}
(2)层序遍历:和求最大深度方法一样,最大深度在每层遍历时depth++,节点个数则是在遍历弹出节点时,count++
func countNodes(root *TreeNode) int { if root == nil { return 0 } count := 0 curQueue := []*TreeNode{root} for len(curQueue) > 0 { nextQueue := []*TreeNode{} for _, node := range curQueue { if node.Left != nil { nextQueue = append(nextQueue, node.Left) } if node.Right != nil { nextQueue = append(nextQueue, node.Right) } count += 1 } curQueue = nextQueue } return count }
104.二叉树的最大深度
11.二叉树的最小深度
222.完全二叉树的节点个数
今天做起来轻松多了,开心
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。