考虑先从自己之后学的树等算法刷起, leetcode, 我不想看论文时的娱乐活动
Leetcode 100 Same Tree
递归前序遍历,但是不知道为什么每次submit的得到的时间不太一样,玄学地很,代码如下:
class Solution(object):
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
#前序遍歷
if p is None and q is None:
return True
elif p is None:
return not q
elif q is None:
return not p
while q and p:
if q.val == p.val:
return (self.isSameTree(q.left, p.left) and self.isSameTree(q.right,p.right))
else:
return False
if q is None and p is None:
return True
else:
return False
在 beat 70%+ 和 8%+ 两个数值飘忽不定,神奇
Discuss中的解法:
1. 同想法较为neat的代码:
def isSameTree(self, p, q):
if p and q:
return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
return p is q
def isSameTree(self, p, q):
return p and q and p.val == q.val and all(map(self.isSameTree, (p.left, p.right), (q.left, q.right))) or p is q
关于 map 的用法:
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
来源:
https://www.cnblogs.com/lincappu/p/8179475.html
2.使用 stack 以及 queue的前序遍历
stack 方法:两两成组怼进栈中匹配判断
class Solution(object):
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
stack = [(p, q)]
while stack:
node1 , node2 = stack.pop()
if not node1 and not node2:
continue
elif None in [node1, node2]:
return False
else:
if node1.val != node2.val :
return False
stack.append((node1.right, node2.right))
stack.append((node1.left, node2.left))
return True
queue方法:和stack的区别不大,其实就是前序判断先判断左节点还是右节点的区别,不会影响时间复杂度和输出。
94. Binary Tree Inorder Traversal
中序遍歷練手,用stack來存(因爲要求不能用遞歸
代碼如下:
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result = []
if root is None:
return root
stack = []
stack.append(root)
while root.left:
stack.append(root.left)
root = root.left
while stack:
curNode = stack.pop()
result.append(curNode.val)
if curNode.right:
stack.append(curNode.right)
root = curNode.right
while(root.left):
stack.append(root.left)
root = root.left
return result
beat 70%+ 难受(╯﹏╰)
Discuss中的思路:(存着,明天写。)