树-leetcode-100

92 阅读2分钟

0️⃣python数据结构与算法学习路线
学习内容:

  • 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
  • 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…

题目:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

输入输出:

输入:p = [1,2,3], q = [1,2,3]
输出:true

解题思路:

  1. 深度优先算法
    从下往上的实现方法(c++的模板)
    在这里插入图片描述
    在这里插入图片描述

第一步:base case

  • 如果p,q都是None->返回True
  • 如果p,q其一是None->返回False

第三步:构建当前问题结果

  • 是否左边根节点 等于 右边根节点

第五步:返回答案

  • return 左子树比较结果 and 右子树比较结果
  1. 广度优先算法

算法实现:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
# and or & 和 |的区别又忘了
class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if p==None and q==None:
            return p==q
        elif not p or not q:# 如果其中之一不存在就返回false
            return False
        elif p.val!=q.val:
            return False
        return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right) # 左子树和右子树都True为真

出现问题:

  1. 代码中判断变量是否为None有三种主要的写法:
  • if x is None
  • if not x:
    当X为None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这些时,not X为真(True),即无法分辨出他们之间的不同。
  • if not x is None(这句这样理解更清晰if not (x is None)
  1. 与(&,and),或(|,or)

如果a,b是数值变量, 则&, |表示位运算, and,or则依据是否非0来决定输出

1 & 2 #返回0
1 and 2 #返回1
1&2,2在二进制里面是10,1在二进制中是01,那么01与运算10得到是0

如何a, b是逻辑变量, 则两类的用法基本一致

In[103]:(3>0) | (3<1)
Out[103]: True
In[104]:(3>0) and (3<1)
Out[104]: False
In[105]:(3>0) or (3<1)
Out[105]: True
In[106]:(3>0) & (3<1)
Out[106]: False

  1. None的存储
    在这里插入图片描述
    在python中None是 NoneType 类型,而不是0,这个不存在的点不能使用.val
    所以[1,null,2]这种含有None的测试数据,需要先将含有None的排除
if p==None and q==None:
            return p==q
        elif not p or not q:# 如果其中之一不存在就返回false
            return False