0️⃣python数据结构与算法学习路线
学习内容:
- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…
题目:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入输出:
输入:p = [1,2,3], q = [1,2,3]
输出:true
解题思路:
- 深度优先算法
从下往上的实现方法(c++的模板)
第一步:base case
- 如果p,q都是None->返回True
- 如果p,q其一是None->返回False
第三步:构建当前问题结果
- 是否左边根节点 等于 右边根节点
第五步:返回答案
- return 左子树比较结果 and 右子树比较结果
- 广度优先算法
算法实现:
# 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为真
出现问题:
- 代码中判断变量是否为None有三种主要的写法:
if x is Noneif not x:
当X为None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这些时,not X为真(True),即无法分辨出他们之间的不同。if not x is None(这句这样理解更清晰if not (x is None))
- 与(&,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
- 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