【力扣打卡系列】二叉树·灵活运用递归

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day16

相同的树
  • 题目描述
  • 解题思路
    • 边界条件,其中一个节点为空,return 只有p和q均为空才返回true,因此可以简写为p==q
    • return,先判断节点值是否一样,然后递归判断左子树是否一样,然后递归判断右子树是否一样
  • 代码参考
go 复制代码
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSameTree(p *TreeNode, q *TreeNode) bool {
    if p == nil || q == nil{ // 只要有一个为空就return
        return p == q
    }
    return p.Val == q.Val && isSameTree(p.Left,q.Left) && isSameTree(p.Right,q.Right)
}
  • tips
    • 注意空节点的return条件,只要左或者右有一个为空就返回,p和q必须都是nil才能返回true
    • 比较的时候,需要同时比较p和q的左子树,以及p和q的右子树
对称二叉树
  • 题目描述
  • 解题思路
    • 在上一题的基础上稍加改动
  • 代码参考
go 复制代码
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func isSameTree(p *TreeNode, q *TreeNode) bool{
    if p==nil || q==nil{
        return p==q
    }
    return p.Val == q.Val && isSameTree(p.Left,q.Right) && isSameTree(p.Right,q.Left)
}
func isSymmetric(root *TreeNode) bool {
    return isSameTree(root.Left,root.Right)
}
  • tips
    • 转换为比较左边的右子树是否等于右边的左子树,左边的左子树是否等于右边的右子树即可
平衡二叉树
  • 题目描述
  • 解题思路
    • 对左右子树的深度做递归
  • 代码参考
go 复制代码
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func abs(x int) int{
    if x>0{
        return x
    }else{
        return -x
    }
}

func get_height(root *TreeNode) int{
        if root == nil{
            return 0
        }
        left_height := get_height(root.Left)
        if left_height == -1{
            return -1 //提前退出,不再递归
        }
        right_height := get_height(root.Right)
        if right_height == -1 || abs(right_height - left_height)>1{
            return -1
        }
        return max(right_height,left_height)+1
    }

func isBalanced(root *TreeNode) bool {
    if get_height(root) != -1{
        return true
    }else{
        return false
    }
}
  • tips
    • 需要单独写一个获取树的最大深度的get_height函数
    • go中没有abs函数,需要自己写
    • -1表示不平衡,可以实现提前退出,就不用递归了
二叉树的右视图
  • 题目描述

  • 解题思路

    • 因为要找右视图,所以先递归右子树,再递归左子树
    • 怎么判断节点是否需要记录到答案中
      • 在递归的同时记录节点个数(也就是递归深度),如果递归深度等于答案长度,那么这个节点就需要记录到答案中
      • 递归左子树的时候,深度小于答案长度的就都不计进去
  • 代码参考

go 复制代码
func rightSideView(root *TreeNode) (ans []int) {
    //声明 dfs 为一个函数变量: var dfs func(*TreeNode, int) 声明了一个名为 dfs 的变量,这个变量的类型是一个函数类型。
    var dfs func(*TreeNode, int)
    // 这样,dfs 就可以像普通函数一样被调用,并且在函数体内部它可以递归调用自身。在这里我们可以直接在一个函数内部定义 DFS 逻辑,而不需要创建一个单独的命名函数。
    dfs = func(node *TreeNode, depth int) {
        if node == nil {
            return
        }
        if depth == len(ans) { // 这个深度首次遇到
            ans = append(ans, node.Val)
        }
        dfs(node.Right, depth+1) // 先递归右子树,保证首次遇到的一定是最右边的节点
        dfs(node.Left, depth+1)
    }
    dfs(root, 0)
    return
}
  • tips
    • 声明 dfs 为一个函数变量: var dfs func(*TreeNode, int) 声明了一个名为 dfs 的变量,这个变量的类型是一个函数类型。
    • 这样,dfs 就可以像普通函数一样被调用,并且在函数体内部它可以递归调用自身。在这里我们可以直接在一个函数内部定义 DFS 逻辑,而不需要创建一个单独的命名函数。
相关推荐
小月球~7 小时前
天梯赛 · 并查集
数据结构·算法
仍然.8 小时前
算法题目---模拟
java·javascript·算法
6Hzlia9 小时前
【Hot 100 刷题计划】 LeetCode 118. 杨辉三角 | C++ 动态规划题解
c++·leetcode·动态规划
潇冉沐晴10 小时前
DP——背包DP
算法·背包dp
GIOTTO情10 小时前
2026 世界互联网大会亚太峰会|AI 时代媒介投放的技术实战与算法优化
人工智能·算法
逆境不可逃10 小时前
LeetCode 热题 100 之 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
算法·leetcode·职场和发展
计算机安禾11 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
副露のmagic11 小时前
哈希章节 leetcode 思路&实现
算法·leetcode·哈希算法
副露のmagic11 小时前
字符串章节 leetcode 思路&实现
windows·python·leetcode
csuzhucong11 小时前
puzzle(1037)黑白、黑白棋局
算法