leetcode Tree easy
class TreeNode(object):
def __init__(self,val):
self.val = val
self.left = None
self.right = None
class Solution(object):
def isSameTree(self,p,q):
"""
:type p : TreeNode
:type q : treeNode
:rtype : bool
"""
if not p and not q:
return True
"""
[p , q , not p or not q]
[1 , 1 , 0]
[1 , 0 , 1]
[0 , 1 , 1]
[0 , 0 , 1]
"""
if not p or not q:
return False
if p.val != q.val:
return False
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
def isSameTree_2(self,p,q):
"""
:type p : TreeNode
:type q : TreeNode
:rtype : bool
"""
stack = []
stack.append((p,q))
while(stack):
a,b = stack.pop()
if not a and not b:
continue
if a and b and a.val == b.val:
stack.append((a.left,b.left))
stack.append((a.right,b.right))
else:
return False
return True
def isSymmetric(self,root):
"""
:type root : TreeNode
:rtype : bool
"""
def isMirror(p,q):
if not p and not q:
return True
if not p or not q:
return False
if p.val != q.val:
return False
return isMirror(p.left,q.right) and isMirror(p.right,q.left)
return isMirror(root,root)
def isSymmetric_2(self,root):
"""
:type root : TreeNode
:rtype : bool
"""
stack = []
stack.append((root,root))
while stack:
a,b = stack.pop()
if not a and not b:
continue
if a and b and a.val == b.val:
stack.append((a.left,b.right))
stack.append((a.right,b.left))
else:
return False
return True
def maxDepth(self,root):
"""
:type root:TreeNode
:rtype : int
"""
if not root:
return 0
return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
def maxDepth_2(self,root):
"""
:type root:TreeNode
:rtype : int
"""
stack = []
depth = 0
if not root:
return 0
stack.append((1,root))
while stack:
temp_depth , p = stack.pop()
if p is not None:
depth = max(temp_depth,depth)
stack.append((temp_depth,p.left))
stack.append((temp_depth,p.right))
return depth
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
queue = []
res = []
if not root:
return []
queue.append(root)
while queue:
n = len(queue)
temp = []
for i in range(n):
a = queue.pop(0)
temp.append(a.val)
if a.left:
queue.append(a.left)
if a.right:
queue.append(a.right)
res.append(temp)
return res[::-1]
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
if not nums:
return None
start = 0
end = len(nums)-1
mid = (start + end)//2
if start > end:
return None
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])
return root
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def depth(root):
if not root:
return 0
return max(depth(root.left),depth(root.right))+1
if not root:
return True
return abs(depth(root.left) - depth(root.right)) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)
def minDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
else:
stack, min_depth = [(1, root),], float('inf')
while stack:
depth, root = stack.pop()
children = [root.left, root.right]
if not any(children):
min_depth = min(depth, min_depth)
for c in children:
if c:
stack.append((depth + 1, c))
return min_depth
def hasPathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
"""
if not root:
return False
sum -= root.val
if not root.left and not root.right: # if reach a leaf
return sum == 0
return self.hasPathSum(root.left, sum) or self.hasPathSum(root.right, sum)
"""
if not root:
return False
de = [(root, sum - root.val), ]
while de:
node, curr_sum = de.pop()
if not node.left and not node.right and curr_sum == 0:
return True
if node.right:
de.append((node.right, curr_sum - node.right.val))
if node.left:
de.append((node.left, curr_sum - node.left.val))
return False
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if root is None:
return
root.left, root.right = self.invertTree(root.right),self.invertTree(root.left)
return root
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left,p,q)
elif root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right,p,q)
else:
return root
def binaryTreePaths(self, root):
"""
:type root: TreeNode
:rtype: List[str]
"""
"""
def construct_paths(root, path):
if root:
path += str(root.val)
if not root.left and not root.right: # 当前节点是叶子节点
paths.append(path) # 把路径加入到答案中
else:
path += '->' # 当前节点不是叶子节点,继续递归遍历
construct_paths(root.left, path)
construct_paths(root.right, path)
paths = []
construct_paths(root, '')
return paths
"""
if not root:
return []
paths = []
stack = [(root, str(root.val))]
while stack:
node, path = stack.pop()
if not node.left and not node.right:
paths.append(path)
if node.left:
stack.append((node.left, path + '->' + str(node.left.val)))
if node.right:
stack.append((node.right, path + '->' + str(node.right.val)))
return paths
def sumOfLeftLeaves(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
if root and root.left and not root.left.left and not root.left.right:
return root.left.val+self.sumOfLeftLeaves(root.right)
return self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
if not root:
return 0
def dfs(root,sum):
count=0
if not root:
return 0
if root.val==sum:
count+=1
count+=dfs(root.left,sum-root.val)
count+=dfs(root.right,sum-root.val)
return count
return dfs(root,sum)+self.pathSum(root.left,sum)+self.pathSum(root.right,sum)
def findMode(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
def inorder(root,res = []):
if not root:
return
inorder(root.left,res)
res.append(root.val)
inorder(root.right,res)
return res
if not root:
return
temp = inorder(root)
dic = {}
res = []
for index,num in enumerate(temp):
if num not in dic:
dic[num] = 1
else:
dic[num] +=1
n = max(dic.values())
for index,num in dic.items():
if dic[index] == n:
res.append(index)
return res
def getMinimumDifference(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def inorder(root,res = []):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
return res
if not root:
return
temp = inorder(root)
temp_2 =[]
for i in range(1,len(temp)):
temp_2.append(abs(temp[i]-temp[i-1]))
return min(temp_2)
class Solution(object):
"""
在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。
首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。
如果我们分别正确地递归 root.right 和 root.left ,那么我们就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。
"""
def __init__(self):
self.total = 0
def convertBST(self, root):
if root is not None:
self.convertBST(root.right)
self.total += root.val
root.val = self.total
self.convertBST(root.left)
return root
"""
一个描述迭代栈的方法就是通过递归的思想。
首先我们初始化一个空的栈并把根节点作为当前节点。
然后只要在栈中有未遍历节点或者 node 节点不为空,我们就将当前节点到最右边叶子路径上的点全部压入栈中。
这与递归过程中我们总是先走右子树的思路是一致的,这个思路确保我们总是降序遍历所有节点的值。
接下来,我们访问栈顶节点,并考虑它的左子树,这就像我们递归中先遍历当前节点再遍历它的左子树的思路。
最后,我们的栈为空并且 node 指向树中最小节点的左孩子 null ,循环结束。
"""
def convertBST(self, root):
total = 0
node = root
stack = []
while stack or node is not None:
while node is not None:
stack.append(node)
node = node.right
node = stack.pop()
total += node.val
node.val = total
node = node.left
return root
def diameterOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.ans = 1
def depth(node):
if not node: return 0
L = depth(node.left)
R = depth(node.right)
self.ans = max(self.ans, L+R+1)
return max(L, R) + 1
depth(root)
return self.ans - 1
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, children):
self.val = val
self.children = children
"""
class Solution(object):
def maxDepth(self, root):
"""
:type root: Node
:rtype: int
"""
"""
if root is None:
return 0
elif root.children == []:
return 1
else:
height = [self.maxDepth(c) for c in root.children]
return max(height) + 1
"""
stack = []
if root is not None:
stack.append((1, root))
depth = 0
while stack != []:
current_depth, root = stack.pop()
if root is not None:
depth = max(depth, current_depth)
for c in root.children:
stack.append((current_depth + 1, c))
return depth
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
if root is None:
return []
stack, output = [root], []
while stack:
root = stack.pop()
output.append(root.val)
stack.extend(root.children[::-1])
return output
class Solution(object):
def isSubtree(self, s, t):
"""
:type s: TreeNode
:type t: TreeNode
:rtype: bool
"""
def issame(p, q):
if not p and not q:
return True
if not p or not q:
return False
return p.val == q.val and issame(p.left, q.left) and issame(p.right, q.right)
if not t:
return True
if not s:
return False
return issame(s, t) or self.isSubtree(s.left, t) or self.isSubtree(s.right, t)
def sumRootToLeaf(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def dfs(node, sum):
if node:
sum = sum*2 + node.val
if not node.left and not node.right:
return sum
return dfs(node.left, sum) + dfs(node.right, sum)
else:
return 0
return dfs(root, 0)
def isCousins(self, root, x, y):
"""
:type root: TreeNode
:type x: int
:type y: int
:rtype: bool
"""
parent = {}
depth = {}
def dfs(node, par = None):
if node:
depth[node.val] = 1 + depth[par.val] if par else 0
parent[node.val] = par
dfs(node.left, node)
dfs(node.right, node)
dfs(root)
return depth[x] == depth[y] and parent[x] != parent[y]
def isUnivalTree(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
vals = []
def dfs(node):
if node:
vals.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return len(set(vals)) == 1
def rangeSumBST(self, root, L, R):
"""
:type root: TreeNode
:type L: int
:type R: int
:rtype: int
"""
def dfs(node):
if node:
if L <= node.val <= R:
self.ans += node.val
if L < node.val:
dfs(node.left)
if node.val < R:
dfs(node.right)
self.ans = 0
dfs(root)
return self.ans
def increasingBST(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
def inorder(node):
if node:
inorder(node.left)
node.left = None
self.cur.right = node
self.cur = node
inorder(node.right)
ans = self.cur = TreeNode(None)
inorder(root)
return ans.right
if __name__ == '__main__':
pass