代码随想录 | Day15 | 2023.12.26 | 二叉树02

今日题目:

102.二叉树的层序遍历
226.反转二叉树
101.对称二叉树

今日总结

层序遍历也是需要背下来的模板。总之记得要使用队列并且有两层循环。对称二叉树这题可以记住怎么处理左右孩子节点。

102.二叉树的层序遍历

要点

  1. 使用队列!
  2. 内部需要单独存储当前队列的长度并添加一层循环,因为此时队列的长度会在处理时不断变化,如果只有一层循环的话结果会有错误。

代码:

func levelOrder(root *TreeNode) [][]int {
    if root == nil {
        return nil
    }
    queue := []*TreeNode{root}
    res := [][]int{}
    for len(queue) > 0 {
        curLength := len(queue)   //在之后处理节点的过程中queue会改变 所以单独使用一个变量存储
        tmpRes := []int{}
        for i :=0;i < curLength; i++ {
            curNode := queue[0]
            tmpRes = append(tmpRes, curNode.Val)
            queue = queue[1:]
            if curNode.Left != nil {
                queue = append(queue, curNode.Left)
            }
            if curNode.Right != nil {
                queue = append(queue, curNode.Right)
            }
        }
        res = append(res, tmpRes)
    }
    return res
}

226. 反转二叉树

要点:

  1. 没啥说的
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.对称二叉树

要点:

  1. 想到内外侧分开处理就好做了
  2. 注意这里的终止条件,不要使用leftNode.Val == rightNode.Val
func isSymmetric(root *TreeNode) bool {
    if root == nil {
        return true
    }
    return compare(root.Left,root.Right)
}

func compare(leftNode *TreeNode, rightNode *TreeNode) bool {
    if leftNode == nil && rightNode != nil {
        return false
    } else if leftNode != nil && rightNode == nil {
        return false
    } else if leftNode == nil && rightNode == nil {
        return true
    } else if leftNode.Val != rightNode.Val {
        return false
    }
    outside := compare(leftNode.Left, rightNode.Right)
    inside := compare(leftNode.Right, rightNode.Left)
    return outside && inside
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值