【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕
应该会超过一部分的面试者。
leecode 101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
参考代码
定义一颗树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int // 根
* Left *TreeNode //左节点
* Right *TreeNode //右节点
* }
*/
GO语言版 递归
- 要知道这是一棵树,只是通过数组的形式表现出来的
简单的用这颗树来举例
因为需要对称,我们入口放入两颗一模一样的树p,q,如果同一棵树p,q的根节点相同,p树的左节点不为空并且q的右节点不为空 && q树的左节点不为空并且p的右节点不为空
或者左右节点都为空,只要出现一边为空,一边不为空,就一定不是对称二叉树。
func isSymmetric(root *TreeNode) bool {
return check(root, root)
}
func check(p, q *TreeNode) bool {
if p == nil && q == nil {
return true
}
if p == nil || q == nil {
return false
}
return p.Val == q.Val && check(p.Left, q.Right) && check(p.Right, q.Left)
}
迭代版
-
定义一个队列(先进先出)
-
将这颗树加入到队列2次
-
队列长度 > 0
-
在取出队列的两棵树u,v
-
都为空,则继续
-
一个为空,一个不为空,则不是对称二叉树。
-
这颗树的根节点不一样,也不是二叉树。
-
将u这颗树的左节点添加进队列
-
将v这棵树的右节点添加进队列。(因为队列先进先出,它两也是先出来)
-
将u这颗树的右节点添加进队列
-
将v这棵树的左节点添加进队列
func isSymmetric(root *TreeNode) bool {
u, v := root, root // 1.
q := []*TreeNode{}
q = append(q, u)
q = append(q, v) // 2.
for len(q) > 0 { // 3.
u, v = q[0], q[1]
q = q[2:] // 4.
if u == nil && v == nil { // 5.
continue
}
if u == nil || v == nil { // 6.
return false
}
if u.Val != v.Val { // 7.
return false
}
q = append(q, u.Left) // 8.
q = append(q, v.Right) // 9.
q = append(q, u.Right) // 10.
q = append(q, v.Left) // 11.
}
return true
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️