[代码随想录]Day13-二叉树part02
1.[代码随想录]Day01-数组part012.[代码随想录]Day02-数组part023.[代码随想录]Day06-哈希表 part024.[代码随想录]Day05-哈希表 part015.[代码随想录]Day04-链表part026.[代码随想录]Day03-链表part017.[代码随想录]Day14-二叉树part03
8.[代码随想录]Day13-二叉树part02
9.[代码随想录]Day12-二叉树part0110.[代码随想录]Day11-栈与队列part0311.[代码随想录]Day10-栈与队列part0212.[代码随想录]Day09-栈与队列part0113.[代码随想录]Day08-字符串 part0214.[代码随想录]Day07-字符串 part0115.[代码随想录]Day30-贪心算法part0416.[代码随想录]Day29-贪心算法part0317.[代码随想录]Day28-贪心算法part0218.[代码随想录]Day27-贪心算法part0119.[代码随想录]Day26-回溯算法part0620.[代码随想录]Day25-回溯算法part0521.[代码随想录]Day24-回溯算法part0422.[代码随想录]Day23-回溯算法part0323.[代码随想录]Day22-回溯算法part0224.[代码随想录]Day21-回溯算法part0125.[代码随想录]Day20-二叉树part0926.[代码随想录]Day19-二叉树part0827.[代码随想录]Day18-二叉树part0728.[代码随想录]Day17-二叉树part0629.[代码随想录]Day16-二叉树part0530.[代码随想录]Day15-二叉树part0431.[代码随想录]Day52-单调栈part0332.[代码随想录]Day51-单调栈part0233.[代码随想录]Day50-单调栈part0134.[代码随想录]Day49-动态规划part1735.[代码随想录]Day48-动态规划part1636.[代码随想录]Day47-动态规划part1537.[代码随想录]Day46-动态规划part1438.[代码随想录]Day45-动态规划part1339.[代码随想录]Day44-动态规划part1240.[代码随想录]Day43-动态规划part1141.[代码随想录]Day42-动态规划part1042.[代码随想录]Day41-动态规划part0943.[代码随想录]Day40-动态规划part0844.[代码随想录]Day39-动态规划part0745.[代码随想录]Day38-动态规划part0646.[代码随想录]Day37-动态规划part0547.[代码随想录]Day36-动态规划part0448.[代码随想录]Day35-动态规划part0349.[代码随想录]Day34-动态规划part0250.[代码随想录]Day33-动态规划part0151.[代码随想录]Day32-贪心算法part0652.[代码随想录]Day31-贪心算法part05题目:102. 二叉树的层序遍历
思路:
先把根放进去,然后每次都是左右就可以了。
记录一个深度,当len(res) == deepth
的时候就说明这个深度还没有实例化,先搞一个再去收集。
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
var res [][]int
func levelOrder(root *TreeNode) [][]int {
res = [][]int{}
level(root,0) // 根
return res
}
func level(t *TreeNode,deepth int) {
if t == nil { // 如果没有就返回
return
}
if len(res) == deepth { // 实例化这一层
res = append(res, []int{})
}
res[deepth] = append(res[deepth], t.Val) // 在这一层添加数据
level(t.Left, deepth+1) // 遍历左节点
level(t.Right, deepth+1) // 遍历右节点
}
参考:
题目:226. 翻转二叉树
思路:
二叉树的题递归分三步:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑(前序、中序、后序、层序)
翻转二叉树,参数必然是树的指针,返回的结果是翻转后的二叉树同样也是一个树的指针。
当没有节点可以翻转了就结束。
这道题可以先把根翻转了,再去翻转左右节点可以;也可以先翻转左右节点再去翻转根,因此选择前序或者后序遍历。翻转就是把左右节点交换。可以尝试结合画图来理解。
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func invertTree(root *TreeNode) *TreeNode {
if root == nil { // 空就不翻转
return nil
}
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
参考:
题目:101. 对称二叉树
思路:
二叉树的题递归分三步:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑(前序、中序、后序、层序)
这题是需要两个子树同时进行的,想要判断对称:
- 左子树的左侧 = 右子树的右侧 ,即外侧相同
- 左子树的右侧 = 右子树的左侧 ,即内侧相同
那么参数就是一个左子树一个右子树,返回结果为true 或者 false。
终止条件是出现false:
- 左子树nil,右子树不为nil
- 左子树不为nil,右子树nil
- 左子树不为nil,右子树不为nil,但是左子树不等于右子树
以及true的条件:左子树 = 右子树 = nil (左子树 = 右子树 ≠ nil的情况是继续向下递归因此不是终止条件)
本题只能是后序遍历,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
return compare(root.Left, root.Right)
}
func compare(left, right *TreeNode) bool {
if left != nil && right == nil {
return false
}else if left == nil && right != nil {
return false
}else if left == nil && right == nil {
return true
}else if left.Val != right.Val {
return false
}
outside := compare(left.Left, right.Right) // 外侧是不是相同
inside := compare(left.Right, right.Left) // 内侧是不是相同
root := outside && inside // 根节点根据内外侧是否相同来决定是true还是false
return root
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!