ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode(10)二叉树子树、子结构系列题目

2022-05-14 12:31:07  阅读:121  来源: 互联网

标签:10 right return self 子结构 subRoot 二叉树 root left


注意:如果当前节点会对下面的子节点有整体影响,可以通过辅助函数增长参数列表,借助参数传递信息。

子树题目

101. 对称二叉树

注意:只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

#递归
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.compare(root.left, root.right)
    def compare(self, left, right):
        #首先排除空节点的情况
        if left == None and right == None:
            return True
        # elif left == None and right !=None:
        #     return False
        # elif left != None and right == None:
        #     return False
        elif left == None or right == None:
            return False
        #排除了空节点,再排除数值不相同的情况
        elif left.val != right.val:
            return False

        #此时就是:左右节点都不为空,且数值相同的情况
        #此时才做递归,做下一层的判断
        outside = self.compare(left.left, right.right) #左子树:左、 右子树:右
        inside = self.compare(left.right, right.left) #左子树:右、 右子树:左
        isSym = inside and outside #左子树:中、 右子树:中 (逻辑处理)
        return isSym

100. 相同的树

判断两个树是否相等的三个条件是的关系,即:

  • 当前两个树的根节点值相等;
  • 并且,s 的左子树和 t 的左子树相等;
  • 并且,s 的右子树和 t 的右子树相等。

作者:fuxuemingzhu
链接:https://leetcode.cn/problems/subtree-of-another-tree/solution/dui-cheng-mei-pan-duan-zi-shu-vs-pan-duan-xiang-de/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#递归
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        elif not p or not q or p.val != q.val:
            return False
        left = self.isSameTree(p.left, q.left)
        right = self.isSameTree(p.right, q.right)
        # 注意是与
        return left and right
572. 另一棵树的子树
面试题 04.10. 检查子树

而判断 t 是否为 s 的子树的三个条件是的关系,即:

  • 当前两棵树相等;
  • 或者,t 是 s 的左子树;
  • 或者,t 是 s 的右子树。
class Solution:
    def isSubtree(self, root: TreeNode, subRoot: TreeNode) -> bool:
        if not root or not subRoot:
            return False
        # 注意是或
        return self.compare(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)

    def compare(self, root, subRoot):
        if not root and not subRoot:
            return True
        elif not root or not subRoot or root.val != subRoot.val:
            return False
        return self.compare(root.left, subRoot.left) and self.compare(root.right, subRoot.right)
剑指 Offer 27. 二叉树的镜像
class Solution:
    def mirrorTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return root
        left = self.mirrorTree(root.left)
        right = self.mirrorTree(root.right)
        root.left, root.right = right, left
        return root

子结构题目

子树和子结构的区别是:
子树要求

if not root and not subRoot:  #只有AB同时为空才是true
            return True

而子结构只要

if not B:  # 判断子结构到叶节点处时,不要求A也到叶子节点
            return True

即从某个节点到达叶子节点都一样才算子树,例如下面是子结构但不是子树:

剑指 Offer 26. 树的子结构
class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        if not A or not B:
            return False
        return self.compare(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)

    def compare(self, A, B):
        if not B:  # 判断子结构到叶节点处时,不要求A也到叶子节点
            return True
        elif not A or A.val != B.val:
            return False
        return self.compare(A.left, B.left) and self.compare(A.right, B.right)


1367. 二叉树中的列表

标签:10,right,return,self,子结构,subRoot,二叉树,root,left
来源: https://www.cnblogs.com/ttyangY77/p/16269639.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有