Leetcode 100相同二叉树 110平衡二叉树

今天偶尔翻起来leetcode,用英文网站的也试做了一下,感觉还是英文的好,有讨论区有答案对比,更丰富一些。

100.相同的树

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

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

示例 1:

输入:       1         1
          / \       / \
         2   3     2   3

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

输出: true

示例 2:

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false

示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

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

输出: false

思路是一个递归自顶向下找的过程。判断两个都是空就True,一空另一个不空就是False,接下来val值不相等就False,以及左右子树对不上就False,这些都不是再比较左右子树:左子树或者右子树有一个是False直接返回False。代码如下:

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

class Solution:
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if p == None and q == None:
            return True
        elif (p == None and q != None) or (p != None and q == None):
            return False

        if p.val != q.val:
            return False
        elif (p.left != None and q.left == None) or (p.left == None and q.left != None) or \
            (p.right != None and q.right == None) or (p.right == None and q.right != None):
            return False
        else:
            result1 = self.isSameTree(p.left, q.left)
            if not result1:
                return False
            result2 = self.isSameTree(p.right, q.right)
            if not result2:
                return False

        return True

在末尾判断左右子树那块,一开始没加的,leetcode提示通过,但只赢了5%左右的代码……我果断加上了这部分提前判断,一下就升到了96.05%。可见时间复杂度差距还是挺大的!

110.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

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

    3
   / \
  9  20
    /  \
   15   7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

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

返回 false 。

思路就是递归下去求子树的高度。叶节点的下边,就是nil(算法导论里的那种节点,其实没有,就是个None)的高度为0;每个节点(包括叶节点)的高度是两个子节点高度中的较大值+1。所以定义一个calHeight方法,并不难写。

此题一个关键点是,如果在某个分叉遇到了高度差大于2,应及时返回FALSE,后边的检查都不需要做了。我的做法是返回一个两个元素的list,第一个是高度,第二个是是否需要检查(即之前已经判断出是否高度差小于等于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 isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        result = self.calHeight(root, True)
        return result[1]

    def calHeight(self, node, needCheck):
        if not needCheck:
            return [2, False]
        else:
            if node == None:
                return [0, True]
            else:
                leftheight = self.calHeight(node.left, True)
                print(leftheight)
                if not leftheight[1]:
                    return [2, False]

                rightheight = self.calHeight(node.right, True)
                print(rightheight)
                if not rightheight[1]:
                    return [2, False]
                
                if abs(leftheight[0] - rightheight[0]) > 1:
                    return [2, False]
                else:
                    return [max(leftheight[0], rightheight[0]) + 1, True]

最终用时beat了100%用python的代码,哈哈哈还挺高兴的!

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/u014292401/article/details/82891389
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞