104.二叉树的最大深度
这里使用的是递归的方法。
遍历方式:后序遍历。
每次比较左右子树的高度,选最大的。然后加1,原因就是如果递归到下一层是空的,那么回溯,当前这一层肯定是有一层的,是要加1的。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxDepth(root *TreeNode) int {
// 思路:可以使用层次遍历,也可以使用迭代法
// 先用一波递归法吧,三要素:参数和返回值、终止条件、单层逻辑
if root == nil {
return 0
}
leftH := maxDepth(root.Left)
rightH := maxDepth(root.Right)
return max(leftH, rightH) + 1
}
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
111.二叉树的最小深度
这个题还是很有趣的,首先看下定义,最小深度指的是从根几点到叶子结点的距离。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func minDepth(root *TreeNode) int {
// 最小深度是根节点到**叶子结点**的最小深度。所以必须是叶子节点,左右没有节点的。
// 还是使用递归方法吧
// 当左节点为空时,
if root == nil {
return 0
}
leftH := minDepth(root.Left)
rightH := minDepth(root.Right)
// 只有右节点
if root.Left == nil && root.Right != nil {
return rightH + 1
}
// 只有左节点
if root.Left != nil && root.Right == nil {
return leftH + 1
}
// 左右节点
return min(leftH, rightH) + 1
}
func min(a, b int) int {
if a < b {
return a
} else {
return b
}
}
222. 完全二叉树的节点个数
这个题还是很绕的,我还得好好的想一想。
首先想到的是使用递归的方法对一个二叉树进行遍历。
func countNodes(root *TreeNode) int {
// 我的思路:利用完全二叉树的特点来解决。
// 左子树和右子树,肯定相差一层,只需要遍历一次。
// 解法1:普通的迭代
if root == nil {
return 0
}
leftNum := countNodes(root.Left)
rightNum := countNodes(root.Right)
return 1 + leftNum + rightNum // 1 是当前这个节点
}
利用完全二叉树的性质,节点都集中在左侧。
每一个节点都判断一波是不是完全二叉树,如果是,那么根据高度计算出节点数,直接返回,就无需继续递归了。
如果不是二叉树,还是按照普通二叉树的遍历方式,加1既可。
func countNodes(root *TreeNode) int {
// 我的思路:利用完全二叉树的特点来解决。
// 解法2:利用完全二叉树的性质
if root == nil {
return 0
}
left := root.Left
right := root.Right
leftLen, rightLen := 0, 0
for left != nil {
left = left.Left
leftLen++
}
for right != nil {
right = right.Right
rightLen++
}
if leftLen == rightLen {
return (2 << leftLen) - 1 // 满二叉树的节点个数
}
return 1 + countNodes(root.Left) + countNodes(root.Right) // 1 是当前这个节点
}