刷题笔记day16-二叉树的深度

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 是当前这个节点
}

你可能感兴趣的:(笔记,算法,leetcode)