首页 > 其他分享 >leetcode 101. Symmetric Tree

leetcode 101. Symmetric Tree

时间:2023-05-30 17:34:39浏览次数:35  
标签:right return Tree Symmetric n1 n2 101 root left

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

1
   / \
  2   2
 / \ / \
3  4 4  3

But the following [1,2,2,null,3,null,3] is not:

1
   / \
  2   2
   \   \
   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

先看迭代解法,就是先序遍历,不过顺序是左子树按照root->left->right顺序,右子树按照root->right->left顺序比较每次遍历的节点是否相等。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # use preorder to traverse root.left and root.right
        if not root: return True        
        stack1, stack2 = [root.left], [root.right]
        while stack1 and stack2:
            n1, n2 = stack1.pop(), stack2.pop()
            if n1 and n2 and n1.val == n2.val:
                if n1.right and n2.left: 
                    stack1.append(n1.right)
                    stack2.append(n2.left)
                elif n1.right or n2.left:
                    return False
                if n1.left and n2.right: 
                    stack1.append(n1.left)
                    stack2.append(n2.right)
                elif n1.left or n2.right:
                    return False
            elif n1 or n2:
                return False
        return len(stack1)==0 and len(stack2)==0

优化下:

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # use preorder to traverse root.left and root.right
        if not root: return True       
        stack1, stack2 = [root.left], [root.right]
        while stack1 and stack2:
            n1, n2 = stack1.pop(), stack2.pop()
            if not n1 and not n2: continue
            if (n1 and not n2) or (n2 and not n1): return False
            if n1.val != n2.val: return False
            stack1.append(n1.right)
            stack2.append(n2.left)
            stack1.append(n1.left)
            stack2.append(n2.right)
        return len(stack1)==0 and len(stack2)==0

 

递归解法:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # use preorder to traverse root.left and root.right
        if not root: return True        
        
        def is_equal(l, r):
            if l and r:
                if l.val != r.val: return False
                return is_equal(l.left, r.right) and is_equal(l.right, r.left)
            else:
                return l == r
        
        return is_equal(root.left, root.right)

BFS:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # use preorder to traverse root.left and root.right
        if not root or root.left == root.right: return True      
        
        def is_one_null(n1, n2):
            return (n1 and not n2) or (not n1 and n2)
        
        if is_one_null(root.left, root.right): return False
        
        q = [root.left, root.right]
        while q:
            leng = len(q)
            for i in xrange(0, leng/2):
                l, r = q[i], q[leng-1-i]
                if l.val == r.val:
                    if is_one_null(l.left, r.right) or is_one_null(l.right, r.left):
                        return False                    
                else:
                    return False
            q = [node for n in q for node in (n.left, n.right) if node]
        return True

或者是将两个待比较的节点放在一起入队和出队。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # use preorder to traverse root.left and root.right
        if not root: return True      
        
        def is_one_null(n1, n2):
            return (n1 and not n2) or (not n1 and n2)
        
        q = collections.deque([root.left, root.right])
        while q:
            n1, n2 = q.popleft(), q.popleft()
            if not n1 and not n2: continue
            if is_one_null(n1, n2): return False
            if n1.val != n2.val: return False
            q.append(n1.left)
            q.append(n2.right)
            q.append(n1.right)
            q.append(n2.left)
        return True

 黄色部分可以简化下代码。避免冗余的if判断!

再度优化下之前的stack 迭代代码:

class Solution2:
  def isSymmetric(self, root):
    if root is None:
      return True

    stack = [[root.left, root.right]]

    while len(stack) > 0:
      pair = stack.pop(0)
      left = pair[0]
      right = pair[1]

      if left is None and right is None:
        continue
      if left is None or right is None:
        return False
      if left.val == right.val:
        stack.insert(0, [left.left, right.right])

        stack.insert(0, [left.right, right.left])
      else:
        return False
    return True

 

这种题目就是考察是否细心。

public boolean isSymmetric(TreeNode root) {
    return root==null || isSymmetricHelp(root.left, root.right);
}

private boolean isSymmetricHelp(TreeNode left, TreeNode right){
    if(left==null || right==null)
        return left==right;
    if(left.val!=right.val)
        return false;
    return isSymmetricHelp(left.left, right.right) && isSymmetricHelp(left.right, right.left);
}

 黄色部分等价于:

if(p==null && q==null) return true;
    if(p==null || q==null) return false;

 

标签:right,return,Tree,Symmetric,n1,n2,101,root,left
From: https://blog.51cto.com/u_11908275/6381012

相关文章

  • java treemap
    TreeMap是Java中的一个类,它实现了Map接口,利用红黑树数据结构来有序存储键值对。TreeMap中的键按升序排序,若要自定义排序方式,则可以提供自定义的比较器。TreeMap实现了高效的数据访问、插入和删除操作,大多数常规操作的时间复杂度为O(logn)。importjava.util.TreeMap;public......
  • 代码随想录算法训练营第15天 | ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉
     第六章二叉树 part02 今日内容:  ●  层序遍历  10 ●  226.翻转二叉树 ●  101.对称二叉树 2    详细布置   层序遍历  看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。 题目链接/文章讲解/视频讲解:htt......
  • hdu 4101(bfs+博弈)
    题意:题目的意思就是说两个人轮流玩游戏,给你一张地图,这个地图中间有一点-1代表宝藏,AliandBaba轮流走路,如果某一个人能够直接走到宝藏的话,那么他就赢了。地图上其它的点0代表空地,数字代表当前地点的石子当某一人拿石子的时候,他只能拿走一颗。问你谁最后能拿到宝藏;解题思路:宝藏位于-......
  • SourceTree使用教程
    SourceTree使用教程1.克隆、提交、推送​ 在使用SourceTree之前必须要先安装Git和sourceTree,具体安装过程不再赘述(1)以加入我的管理团队为例,进入5-27-dq这个仓库,点击管理,然后进入仓库成员管理,发现现在我的仓库成员有4个了,gitee免费版最多可5个成员。​ 若要加入我的代码仓,请......
  • 算法刷题记录:珂朵莉的假toptree
    题目链接https://ac.nowcoder.com/acm/contest/19306/1035题目分析将每个数每一位都进行拆分即可。AC代码#include<iostream>usingnamespacestd;intn,p=1,num=1;inta[1005];intmain(){cin>>n;while(p<=1000){if(num>=1......
  • 1151 LCA in a Binary Tree
    题目:Thelowestcommonancestor(LCA)oftwonodesUandVinatreeisthedeepestnodethathasbothUandVasdescendants.Givenanytwonodesinabinarytree,youaresupposedtofindtheirLCA.InputSpecification:Eachinputfilecontainsonetest......
  • 【技术分享】万字长文图文并茂读懂高性能无锁 “B-Tree 改”:Bw-Tree
    【技术分享】万字长文图文并茂读懂高性能无锁“B-Tree改”:Bw-Tree原文链接:https://mp.weixin.qq.com/s/I5TphQP__tHn6JoPcP--_w参考文献不一定能下载。如果你获取不到这几篇论文,可以关注公众号IT技术小密圈回复bw-tree获取。一.背景Bw-Tree希望实现以下能力:解决......
  • 力扣 662 https://leetcode.cn/problems/maximum-width-of-binary-tree/
    需要了解树的顺序存储如果是普通的二叉树,底层是用链表去连接的如果是满二叉树,底层用的是数组去放的,而数组放的时候会有索引对应当前父节点是索引i,下一个左右节点就是2i,2i+1利用满二叉树的索引特征所以需要对每个节点进行一个索引赋值,赋值在队列中,队列用数组表示核心代码......
  • Paper Reading: Adaptive Neural Trees
    目录研究动机文章贡献自适应神经树模型拓扑与操作概率模型与推理优化实验结果模型性能消融实验可解释性细化阶段的影响自适应模型复杂度优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。具体的细节还需要以原文......
  • Cassandra中的MerkleTree反熵机制
    构建MerkleTreeCassandra是一个分布式数据库系统,它使用Merkle树来实现数据一致性和数据完整性的验证。在Cassandra中,每个节点都维护着自己的数据副本。为了确保数据的一致性和完整性,Cassandra使用Merkle树进行验证。Merkle树是一种树状结构,由哈希值构成,用于对数据块进......