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

坚持按题型打卡&刷&梳理力扣算法题系列,语言为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 逻辑,而不需要创建一个单独的命名函数。
相关推荐
Zzz 小生6 分钟前
Lazy Theta*:把昂贵的视线检测留到“真正需要”时再做
人工智能·算法·贪心算法·推荐算法
l12586542 分钟前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain
我命由我123451 小时前
财务学习 - 配比原则
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·学习方法
ylj_dev1 小时前
从 0 构建 AI Workload Platform(九):真实场景、最小控制台与开源发布
go·react·开源项目·工作流·ai agent
青少儿编程课堂1 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
evans在进步1 小时前
LeetCode 438 找到字符串中所有字母异位词:滑动窗口与排序解法详解
算法·leetcode·职场和发展
M78佐菲1 小时前
Linux多线程:创建、回收与互斥同步
linux·笔记·学习·算法
小手cool2 小时前
使用递归对数组进行反转操作
java·数据结构·算法
兔兔兔兔12 小时前
记录C++ 13
开发语言·c++·算法
码行山野赴时序归途2 小时前
从暴力到最优:三道 C 语言入门题的解法思路
c语言·开发语言·数据结构·算法·leetcode·排序算法