zoukankan      html  css  js  c++  java
  • leetcode刷题-100~105

    题目100题

    相同的树

    给定两个二叉树,编写一个函数来检验它们是否相同。

    如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

    示例 1:

    输入:  1       1
           /     /
          2   3 2    3

    [1,2,3], [1,2,3]

    输出: true

    思路

    深度优先遍历:

      当两个二叉树都为空,则两个二叉树相同。

      当两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

      当二叉树都不为空时,判定根节点的值是否相同。

      递归查询其左子树和右子树。

    实现

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
            if p == None and q == None:
                return True
            elif p == None or q == None:
                return False
            elif p.val != q.val:
                return False
            else:
                return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

    题目101题

    对称二叉树

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

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

         1
        /
       2   2
      / /
      3 4 4 3
     

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

         1
        /
       2  2
           
         3   3

    思路

    两个树互为镜像的条件:

    1.它们的两个根结点具有相同的值

    2.每个树的右子树都与另一个树的左子树镜像对称

    因此可以通过递归的方式不断移动两个指针来比较

    实现

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def isSymmetric(self, root: TreeNode) -> bool:
            def check(left: TreeNode, right:TreeNode) -> bool:
                if not left and not right:
                    return True
                elif not left or not right:
                    return False
                elif left.val != right.val:
                    return False
                else:
                    return check(left.left, right.right) and check(left.right, right.left)
            return check(root, root)

    题目102题

    二叉树的层次遍历

    给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

    示例:
    二叉树:[3,9,20,null,null,15,7],

          3
         /
        9 20
          / 
         15   7
    返回其层次遍历结果:

    [
    [3],
    [9,20],
    [15,7]
    ]

    思路

    给每个节点增加一个在第几层的设定,通过递归实现,每向下遍历左子树和右子树,则下一层的level增加1

    实现

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            def helper(node: TreeNode, result, lev):
                if node:
                    if len(result) <= lev:
                        result.append([])
                    result[lev].append(node.val)
                    if node.left:
                        helper(node.left, result,lev+1)
                    if node.right:
                        helper(node.right, result,lev+1)
    
            level = 0
            result = []
            helper(root, result, level)
            return result

    题目103题

    二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

    例如:
    给定二叉树 [3,9,20,null,null,15,7],

       3
      /
     9  20
         /
        15  7
    返回锯齿形层次遍历如下:

    [
    [3],
    [20,9],
    [15,7]
    ]

    思路

    此题与102题非常的类似,同样使用的是深度优先遍历DFS,但是其要求锯齿状遍历,因此可以根据其层数决定其插入方式,若层数为偶数(从0层开始),则新元素添加在末尾,若层数为基数,新元素添加在开头。

    实现

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
            def helper(node: TreeNode, result, lev):
                if root:
                    if len(result) <= lev:
                        result.append([])
                    if lev % 2 == 0:
                        result[lev].append(node.val)
                    else:
                        result[lev].insert(0, node.val)
                    if node.left:
                        helper(node.left, result,lev+1)
                    if node.right:
                        helper(node.right, result,lev+1)
                    
    
            level = 0
            result = []
            helper(root, result, level)
            return result

    题目104题

    二叉树的最大深度

    给定一个二叉树,找出其最大深度。

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

    说明: 叶子节点是指没有子节点的节点。

    示例:
    给定二叉树 [3,9,20,null,null,15,7],

           3
          /
         9  20
             /
           15   7
    返回它的最大深度 3

    思路

    此题方法很多,深度优先/递归都可实现

    实现

    #中序遍历
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def maxDepth(self, root: TreeNode) -> int:
            if root is None:
                return 0
            self.result = 1
            def inorder(tree, res):
                if tree != None:
                    if res >= self.result:
                        self.result = res
                    if tree.left != None:
                        inorder(tree.left, res + 1)
                    if tree.right != None:
                        inorder(tree.right, res + 1)
            inorder(root, self.result)
            return self.result
    
    #递归
    class Solution:
        def maxDepth(self, root):
            if root is None: 
                return 0 
            else: 
                left = self.maxDepth(root.left) 
                right = self.maxDepth(root.right) 
                return max(left, right) + 1 

    题目105题

    从前序与中序遍历序列构造二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:

       3
      /
     9  20
         /
       15   7

    思路

    只要在中序遍历中定位到根节点,就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。

    实现

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
            def build(preorder_left, preorder_right, inorder_left, inorder_right):
                if preorder_left > preorder_right:
                    return None
                new_root = preorder[preorder_left]
                root = TreeNode(new_root)
                index = inorder.index(new_root)
                left_size = index - inorder_left
                root.left = build(preorder_left + 1, preorder_left + left_size, inorder_left, index - 1)
                root.right = build(preorder_left + left_size + 1, preorder_right, index + 1, inorder_right)
                return root
            n = len(preorder)
            return build(0, n - 1, 0, n - 1)
  • 相关阅读:
    Effective C++ 读书笔记(3544):继承关系与面向对象设计
    《全景探秘游戏设计艺术》读后感之引子
    Effective C++ 读书笔记(1117):构造析构和赋值函数
    Effective C++ 读书笔记(2934):类与函数之实现
    Unity中使用PersistentDataPath加载文件
    打开本地【C】【D】【E】驱动器时候提示 X:\ 找不到应用程序
    C#进制转换
    在VS里编辑unity代码调用系统方法不显示中文注释或英文注释
    Spreadsheet说明
    C#中删除控件的事件的方法类.
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13651787.html
Copyright © 2011-2022 走看看