二叉树之对称二叉树|Go主题月

2,031 阅读2分钟

【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕

应该会超过一部分的面试者。

leecode 101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

 

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

图片.png  

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

  图片.png

进阶:

你可以运用递归和迭代两种方法解决这个问题吗?


参考代码

定义一颗树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int          // 根
 *     Left *TreeNode   //左节点
 *     Right *TreeNode  //右节点
 * }
 */

GO语言版 递归

  1. 要知道这是一棵树,只是通过数组的形式表现出来的

图片.png

简单的用这颗树来举例

因为需要对称,我们入口放入两颗一模一样的树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) 
}

迭代版

  1. 定义一个队列(先进先出)

  2. 将这颗树加入到队列2次

  3. 队列长度 > 0

  4. 在取出队列的两棵树u,v

  5. 都为空,则继续

  6. 一个为空,一个不为空,则不是对称二叉树。

  7. 这颗树的根节点不一样,也不是二叉树。

  8. 将u这颗树的左节点添加进队列

  9. 将v这棵树的右节点添加进队列。(因为队列先进先出,它两也是先出来)

  10. 将u这颗树的右节点添加进队列

  11. 将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块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️