# Definition for a binary tree node. classTreeNode: def__init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right
# 前序 stack = [root] res = [] while stack: node = stack.pop() res.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) print("前序结果是:", res)
# 后序 stack = [root] res = [] while stack: node = stack.pop() res.append(node.val) if node.left: stack.append(node.left) if node.right: stack.append(node.right) print("后序结果是:", res)
# 中序,注意这里不能直接将root加入进去 stack = [] cur = root res = [] while stack or cur: if cur: stack.append(cur) cur = cur.left else: cur = stack.pop() res.append(cur.val) cur = cur.right print("中序结果是:", res)
# 层序遍历 from _collections import deque queue = deque([root]) while queue: temp = [] for i inrange(len(queue)): node = queue.popleft() temp.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) print(temp) # 层序遍历2 from _collections import deque queue = deque([root]) while queue: temp = [] for i inrange(len(queue)): node = queue.popleft() if node: temp.append(node.val) queue.append(node.left) queue.append(node.right) print(temp)
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: definvertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: ifnot root: return root from collections import deque queue = deque([root]) while queue: for i inrange(len(queue)): node = queue.popleft() if node.left: queue.append(node.left) if node.right: queue.append(node.right) node.left, node.right = node.right, node.left return root
递归解法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: definvertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: ifnot root: return root root.left, root.right = root.right, root.left self.invertTree(root.left) self.invertTree(root.right) return root
对称二叉树[101]
迭代解法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution: defisSymmetric(self, root: Optional[TreeNode]) -> bool: ifnot root: returnTrue from _collections import deque queue = deque([root]) while queue: res = [] for i inrange(len(queue)): node = queue.popleft() if node: res.append(node.val) queue.append(node.left) queue.append(node.right) else: res.append(None) if res != res[::-1]: returnFalse returnTrue
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defisSymmetric(self, root: Optional[TreeNode]) -> bool: defcheck(p,q): if p andnot q: returnFalse ifnot p and q: returnFalse ifnot p andnot q: returnTrue if p.val != q.val: returnFalse return check(p.left, q.right) and check(p.right, q.left) ifnot root: returnTrue return check(root, root)
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defcountNodes(self, root: Optional[TreeNode]) -> int: ifnot root: return0 from collections import deque queue = deque([root]) cnt = 0 while queue: for i inrange(len(queue)): node = queue.popleft() cnt += 1 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return cnt
递归解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: def__init__(self): self.cnt = 0
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defmaxDepth(self, root: Optional[TreeNode]) -> int: ifnot root: return0 from collections import deque queue = deque([root]) res = [] while queue: temp = [] for i inrange(len(queue)): node = queue.popleft() temp.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(temp) returnlen(res)
递归法如下所示:
1 2 3 4 5 6 7 8 9 10 11
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defmaxDepth(self, root: Optional[TreeNode]) -> int: ifnot root: return0 return1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
classSolution: defsearchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: cur = root while cur: f = cur.val if f < val: cur = cur.right elif f > val: cur = cur.left else: return cur returnNone
classSolution: defisValidBST(self, root: Optional[TreeNode]) -> bool: res = [] definOrder(root): ifnot root: return inOrder(root.left) res.append(root.val) inOrder(root.right) inOrder(root) for i inrange(len(res)-1): if res[i+1] <= res[i]: returnFalse returnTrue
二叉搜索树的最小绝对差[530]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution(object): defgetMinimumDifference(self, root): """ :type root: TreeNode :rtype: int """ res = [] definorder(root): ifnot root: return inorder(root.left) res.append(root.val) inorder(root.right) inorder(root) mins = float("inf") for i inrange(len(res)-1): mins = min(mins, abs(res[i+1] - res[i])) return mins
if val < res_trees[0].val: res_trees[0].left = TreeNode(val) if val > res_trees[-1].val: res_trees[-1].right = TreeNode(val)
for i inrange(len(res_trees)-1): if val>res_trees[i].val and val<res_trees[i+1].val: left = res_trees[i] right = res_trees[i+1] if left.right==None: left.right = TreeNode(val) elif right.left==None: right.left = TreeNode(val) return root