二叉树题目整理
2022-01-06 21:50:50 3 举报
AI智能生成
二叉树题目整理 python解法
作者其他创作
大纲/内容
二叉树的遍历
前序遍历
144二叉树的前序遍历
class Solution:<br> def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:<br> if not root:<br> return []<br> stack = [root, ]<br> ret = []<br> while stack:<br> node = stack.pop()<br> ret.append(node.val)<br> if node.right:<br> stack.append(node.right)<br> if node.left:<br> stack.append(node.left)<br> return ret
589N叉树的前序遍历
class Solution:<br> def preorder(self, root: 'Node') -> List[int]:<br> if not root:<br> return []<br> stack = [root, ]<br> ret = []<br> while stack:<br> node = stack.pop()<br> ret.append(node.val)<br> for d in reversed(node.children):<br> if d:<br> stack.append(d)<br> return ret
后序遍历
145二叉树的后序遍历
class Solution:<br> def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:<br> if not root:<br> return []<br> stack = [root, ]<br> ret = []<br> while stack:<br> node = stack.pop()<br> ret.append(node.val)<br> if node.left:<br> stack.append(node.left)<br> if node.right:<br> stack.append(node.right)<br> return ret[::-1]
590N叉树的后序遍历
class Solution:<br> def postorder(self, root: 'Node') -> List[int]:<br> if not root:<br> return []<br> stack = [root, ]<br> ret = []<br> while stack:<br> node = stack.pop()<br> ret.append(node.val)<br> for d in node.children:<br> if d:<br> stack.append(d)<br> return ret[::-1]
94二叉树的中序遍历
class Solution:<br> def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:<br> stack = []<br> ret = []<br> curr = root<br> while curr or stack:<br> while curr:<br> stack.append(curr)<br> curr = curr.left<br> curr = stack.pop()<br> ret.append(curr.val)<br> curr = curr.right<br> return ret
二叉树的层序遍历
102二叉树的层序遍历
class Solution:<br> def levelOrder(self, root: TreeNode) -> List[List[int]]:<br> if not root:<br> return []<br> queue = [root, ]<br> ret = []<br> while queue:<br> path = []<br> length = len(queue)<br> for _ in range(length):<br> node = queue.pop(0)<br> path.append(node.val)<br> if node.left:<br> queue.append(node.left)<br> if node.right:<br> queue.append(node.right)<br> ret.append(path.copy())<br> return ret
107 二叉树的层次遍历II
199二叉树的右视图
637二叉树的层平均值
429N叉树的层序遍历
class Solution:<br> def levelOrder(self, root: 'Node') -> List[List[int]]:<br> if not root:<br> return []<br> queue = [root]<br> ret = []<br> while queue:<br> length = len(queue)<br> path = []<br> for i in range(length):<br> node = queue.pop(0)<br> path.append(node.val)<br> for candidate_node in node.children:<br> queue.append(candidate_node)<br> ret.append(path)<br> return ret
515在每个树行中找最大值
116填充每一个节点的下一个右侧节点指针(完美二叉树)
class Solution:<br> def connect(self, root: 'Node') -> 'Node':<br> if not root:<br> return root<br> queue = [root, ]<br> while queue:<br> length = len(queue)<br> for i in range(length):<br> node = queue.pop(0)<br> if i == 0:<br> start = node<br> else:<br> start.next = node<br> start = node<br> if node.left:<br> queue.append(node.left)<br> if node.right:<br> queue.append(node.right)<br> return root
117填充每一个节点的下一个右侧节点指针II(普通二叉树)
class Solution:<br> def connect(self, root: 'Node') -> 'Node':<br> if not root:<br> return root<br> queue = [root, ]<br> while queue:<br> length = len(queue)<br> for i in range(length):<br> node = queue.pop(0)<br> if i == 0:<br> start = node<br> else:<br> start.next = node<br> start = node<br> if node.left:<br> queue.append(node.left)<br> if node.right:<br> queue.append(node.right)<br> return root
二叉树的属性
101 对称二叉树
递归
class Solution:<br> def isSymmetric(self, root: TreeNode) -> bool:<br> """<br> 属于后序遍历<br> """<br> if not root:<br> return True<br><br> def dfs(node1, node2):<br> if not node1 and not node2:<br> return True<br> elif not node1 and node2:<br> return False<br> elif not node2 and node1:<br> return False<br> elif node1.val != node2.val:<br> return False<br> else: # node.val == node2.val了<br> outside_bool = dfs(node1.left, node2.right)<br> inside_bool = dfs(node1.right, node2.left)<br> return outside_bool and inside_bool<br><br> return dfs(root.left, root.right)
迭代
class Solution:<br> def isSymmetric(self, root: TreeNode) -> bool:<br> if not root:<br> return True<br> stack = [root.left, root.right]<br> while stack:<br> right_node = stack.pop()<br> left_node = stack.pop()<br> if not left_node and not right_node:<br> continue<br> if (left_node and not right_node) or (right_node and not left_node) or (right_node.val != left_node.val):<br> return False<br> else:<br> stack.append(left_node.left)<br> stack.append(right_node.right)<br> stack.append(left_node.right)<br> stack.append(right_node.left)<br> return True
100相同的树
递归
class Solution:<br> def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:<br> if not p and not q:<br> return True<br> if (p and not q) or (q and not p):<br> return False<br> return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
迭代
class Solution:<br> def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:<br> stack = [p, q]<br> while stack:<br> q = stack.pop()<br> p = stack.pop()<br> if not p and not q:<br> continue<br> elif (p and not q) or (q and not p) or (p.val != q.val):<br> return False<br> stack.extend([p.left, q.left, p.right, q.right])<br> return True
最大深度
104二叉树的最大深度
迭代法(层序遍历)
class Solution:<br> def maxDepth(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> queue = [root, ]<br> ret = 0<br> while queue:<br> path = []<br> length = len(queue)<br> for _ in range(length):<br> node = queue.pop(0)<br> path.append(node.val)<br> if node.left:<br> queue.append(node.left)<br> if node.right:<br> queue.append(node.right)<br> ret+=1<br> return ret
递归法
class Solution:<br> def maxDepth(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
559N叉树的最大深度
递归法
class Solution:<br> def maxDepth(self, root: 'Node') -> int:<br> if not root:<br> return 0 # 注意sum里面空值(列表)会报错<br> return 1+(max(self.maxDepth(node) for node in root.children) if root.children else 0)
111二叉树的最小深度
迭代法(层序遍历)
class Solution:
def minDepth(self, root: TreeNode) -> int:
if not root:
return 0
queue = [root, ]
ret = 0
while queue:
length = len(queue)
for _ in range(length):
node = queue.pop(0)
if not node.left and not node.right:
return ret+1
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
ret += 1
return ret
递归法
class Solution:<br> def minDepth(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> if not root.left:<br> return self.minDepth(root.right) + 1<br> if not root.right:<br> return self.minDepth(root.left) + 1<br> return 1 + min(self.minDepth(root.left), self.minDepth(root.right))
222完全二叉树的节点个数
常规遍历法
class Solution:<br> def countNodes(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> stack = [root, ]<br> ret = []<br> while stack:<br> node = stack.pop()<br> ret.append(node.val)<br> if node.right:<br> stack.append(node.right)<br> if node.left:<br> stack.append(node.left)<br> return len(ret)
利用二叉树特性法
class Solution:<br> def countNodes(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> left = root.left<br> right = root.right<br> left_height = 0<br> right_height = 0<br> while left:<br> left = left.left<br> left_height += 1<br> while right:<br> right = right.right<br> right_height += 1<br> if left_height == right_height:<br> return 2 ** (left_height+1) - 1 # left_height是左子树深度,树深度要加1<br> # return (2 << left_height) - 1<br> else:<br> return 1 + self.countNodes(root.left) + self.countNodes(root.right)
110平衡二叉树
class Solution:<br> def isBalanced(self, root: TreeNode) -> bool:<br> if not root:<br> return True<br> def dfs(root):<br> if not root:<br> return 0<br> return 1+max(dfs(root.left), dfs(root.right))<br> left = dfs(root.left)<br> right = dfs(root.right)<br> return abs(left-right) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)
257二叉树的所有路径
回溯法
class Solution:<br> def binaryTreePaths(self, root: TreeNode) -> List[str]:<br> if not root:<br> return []<br> ret = []<br><br> def dfs(root, path):<br> if not root.left and not root.right:<br> ret.append(path.copy())<br> else:<br> for node in [root.left, root.right]:<br> if node:<br> dfs(node, path + [node.val, ])<br> path = [root.val]<br> dfs(root, path)<br> return ['->'.join([str(ii) for ii in i]) for i in ret]
404左叶子之和
递归法
class Solution:<br> def sumOfLeftLeaves(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> if root.left and not root.left.left and not root.left.right:<br> mid = root.left.val<br> else:<br> mid = 0<br> return mid + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
迭代法
class Solution:<br> def sumOfLeftLeaves(self, root: TreeNode) -> int:<br> if not root:<br> return 0<br> stack = [root, ]<br> ret = 0<br> while stack:<br> node = stack.pop()<br> if node.left and not node.left.left and not node.left.right:<br> ret += node.left.val<br> if node.right:<br> stack.append(node.right)<br> if node.left:<br> stack.append(node.left)<br> return ret
513找树左下角的值
迭代法(层序遍历)
class Solution:<br> def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:<br> queue = [root, ]<br> ret = []<br> while queue:<br> path = []<br> length = len(queue)<br> for _ in range(length):<br> node = queue.pop(0)<br> path.append(node.val)<br> if node.left:<br> queue.append(node.left)<br> if node.right:<br> queue.append(node.right)<br> ret.append(path.copy())<br> return ret[-1][0]
递归法
class Solution:<br> def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:<br> self.ret = 0<br> self.max_depth = -1<br> def dfs(node, depth):<br> if not node.left and not node.right:<br> if depth > self.max_depth:<br> self.ret = node.val<br> self.max_depth = depth<br> return<br> if node.left:<br> dfs(node.left, depth+1)<br> if node.right:<br> dfs(node.right, depth+1)<br> return<br><br> dfs(root, 0)<br> return self.ret
112路径总和
递归法
class Solution:<br> def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:<br> if not root:<br> return False<br> if not root.left and not root.right:<br> return root.val == targetSum<br> return self.hasPathSum(root.left, targetSum-root.val) or self.hasPathSum(root.right, targetSum - root.val)
迭代法
113路径总和II
回溯法
class Solution:<br> def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:<br> if not root:<br> return []<br> ret, path = [], []<br> def dfs(node, path, sum_):<br> if not node.left and not node.right:<br> if sum_ == node.val:<br> ret.append(path + [node.val, ])<br> for i in [node.left, node.right]:<br> if i:<br> dfs(i, path + [node.val, ], sum_ - node.val)<br> dfs(root, path, targetSum)<br> return ret
二叉树的修改和构造
226翻转二叉树
递归版本
class Solution:<br> def invertTree(self, root: TreeNode) -> TreeNode:<br> if not root:<br> return root<br> def swap(p):<br> a = p.left<br> p.left = p.right<br> p.right = a<br><br> swap(root)<br> self.invertTree(root.left)<br> self.invertTree(root.right)<br> return root
迭代法
class Solution: <br> def invertTree(self, root: TreeNode) -> TreeNode:<br> def swap(node):<br> a = node.left<br> node.left = node.right<br> node.right = a<br><br> if not root:<br> return root<br> stack = [root, ]<br> while stack:<br> node = stack.pop()<br> swap(node)<br> if node.right:<br> stack.append(node.right)<br> if node.left:<br> stack.append(node.left)<br> return root
654最大二叉树
class Solution:<br> def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:<br> if not nums:<br> return None<br> if len(nums) == 1:<br> return TreeNode(nums[0])<br> max_ = max(nums)<br> index_ = nums.index(max_)<br> root = TreeNode(max_)<br> left = self.constructMaximumBinaryTree(nums[:index_])<br> right = self.constructMaximumBinaryTree(nums[index_+1:])<br> root.left = left<br> root.right = right<br> return root
617合并二叉树
递归(前中后序都可以)
class Solution:<br> def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:<br> if not root1:<br> return root2<br> if not root2:<br> return root1<br> root1.val += root2.val<br> root1.left = self.mergeTrees(root1.left, root2.left)<br> root1.right = self.mergeTrees(root1.right, root2.right)<br> return root1
迭代
class Solution:<br> def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:<br> if not root1:<br> return root2<br> if not root2:<br> return root1<br> stack = [root1, root2]<br> while stack:<br> node2 = stack.pop()<br> node1 = stack.pop()<br> node1.val += node2.val<br> if node1.left and node2.left:<br> stack.append(node1.left)<br> stack.append(node2.left)<br> if node1.right and node2.right:<br> stack.append(node1.right)<br> stack.append(node2.right)<br> if node2.left and not node1.left:<br> node1.left = node2.left<br> if node2.right and not node1.right:<br> node1.right = node2.right<br> return root1
105从中序和前序遍历序列构造二叉树
class Solution:<br> def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:<br> if not inorder:<br> return None<br> if len(preorder) == 1:<br> return TreeNode(preorder[0])<br> else:<br> root_val = preorder[0]<br> index_ = inorder.index(root_val)<br> left = self.buildTree(preorder[1:index_ + 1], inorder[:index_])<br> right = self.buildTree(preorder[index_ + 1:], inorder[index_ + 1:])<br> root = TreeNode(root_val)<br> root.left = left<br> root.right = right<br> return root
106从中序和后续遍历序列构造二叉树
class Solution:<br> def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:<br> if not postorder:<br> return None<br> if len(postorder) == 1:<br> return TreeNode(postorder[-1])<br> else:<br> root_val = postorder[-1]<br> index_ = inorder.index(root_val)<br> left = self.buildTree(inorder[:index_], postorder[:index_])<br> right = self.buildTree(inorder[index_+1:], postorder[index_:-1])<br> root = TreeNode(root_val)<br> root.left = left<br> root.right = right<br> return root
二叉搜索树的属性
700二叉搜索树中的搜索
递归法
初始写法(并不是搜索到结果就直接返回,全部遍历了)
class Solution:<br> def searchBST(self, root: TreeNode, val: int) -> TreeNode:<br> self.ret = None<br><br> def dfs(root, val):<br> if root and root.val == val:<br> self.ret = root<br> return<br> if not root:<br> return None<br> if val > root.val:<br> dfs(root.right, val)<br> else:<br> dfs(root.left, val)<br> dfs(root, val)<br> return self.ret
新写法(搜到结果直接返回)
class Solution:<br> def searchBST(self, root: TreeNode, val: int) -> TreeNode:<br> if not root or root.val == val:<br> return root<br> if val > root.val:<br> return self.searchBST(root.right, val)<br> if val < root.val:<br> return self.searchBST(root.left, val)
迭代法
简洁版(不需栈,一条路遍历下去就行)
class Solution:<br> def searchBST(self, root: TreeNode, val: int) -> TreeNode:<br> while root:<br> if val > root.val:<br> root = root.right<br> elif val < root.val:<br> root = root.left<br> else:<br> return root<br> return None
初始版
class Solution:<br> def searchBST(self, root: TreeNode, val: int) -> TreeNode:<br> if not root:<br> return root<br> stack = [root, ]<br> while stack:<br> node = stack.pop()<br> if node.val == val:<br> return node<br> if node.right and val > node.val:<br> stack.append(node.right)<br> if node.left and val < node.val:<br> stack.append(node.left)<br> return None
98验证二叉搜索树
递归法
class Solution:<br> def __init__(self):<br> self.pre = float('-inf')<br> def isValidBST(self, root: TreeNode) -> bool:<br> if not root:<br> return True<br> left = self.isValidBST(root.left)<br> if not root.val > self.pre:<br> return False<br> else:<br> self.pre = root.val<br> right = self.isValidBST(root.right)<br> return left and right
迭代法
class Solution:<br> def isValidBST(self, root: TreeNode) -> bool:<br> stack = []<br> pre = float('-inf')<br> curr = root<br> while curr or stack:<br> while curr:<br> stack.append(curr)<br> curr = curr.left<br> curr = stack.pop()<br> if curr.val <= pre:<br> return False<br> else:<br> pre = curr.val<br> curr = curr.right<br> return True
530二叉搜索树中的最小绝对差
递归法
class Solution:<br> def __init__(self):<br> self.pre = float('-inf')<br> self.ret = float('inf')<br><br> def getMinimumDifference(self, root: TreeNode) -> int:<br> def dfs(root):<br> if not root:<br> return<br> self.getMinimumDifference(root.left)<br> cur_ret = root.val - self.pre<br> self.ret = min(self.ret, cur_ret)<br> self.pre = root.val<br> self.getMinimumDifference(root.right)<br> dfs(root)<br> return self.ret
迭代法
stack = []<br> ret = float('inf')<br> curr = root<br> pre = float('-inf')<br> while curr or stack:<br> while curr:<br> stack.append(curr)<br> curr = curr.left<br> curr = stack.pop()<br> cur_value = curr.val - pre<br> # print(cur_value)<br> ret = min(ret, cur_value)<br> pre = curr.val<br> curr = curr.right<br> return ret
501二叉搜索树中的众数
递归法
class Solution:<br> def findMode(self, root: TreeNode) -> List[int]:<br> self.ret = []<br> self.pre = None<br> self.cur_count = 0<br> self.max_count = 0<br> def dfs(root):<br> if not root:<br> return<br> dfs(root.left)<br> if not self.pre:<br> self.cur_count = 1<br> elif self.pre.val == root.val:<br> self.cur_count += 1<br> else:<br> self.cur_count = 1<br> self.pre = root<br> if self.cur_count > self.max_count:<br> self.ret.clear()<br> self.max_count = self.cur_count<br> self.ret.append(root.val)<br> elif self.cur_count == self.max_count:<br> self.ret.append(root.val)<br> dfs(root.right)<br> dfs(root)<br> return self.ret
迭代法
class Solution:<br> def findMode(self, root: TreeNode) -> List[int]:<br> stack = []<br> ret = []<br> cur_count = 0<br> max_count = 0<br> pre = None<br> curr = root<br> while curr or stack:<br> while curr:<br> stack.append(curr)<br> curr = curr.left<br> curr = stack.pop()<br> if pre == None:<br> cur_count = 1<br> elif pre.val == curr.val:<br> cur_count += 1<br> else:<br> cur_count = 1<br> pre = curr<br> if cur_count > max_count:<br> ret.clear()<br> ret.append(curr.val)<br> max_count = cur_count<br> elif cur_count == max_count:<br> ret.append(curr.val)<br> curr = curr.right<br> return ret
538把二叉搜索树转换为累加树
迭代
class Solution:<br> def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:<br> stack = []<br> curr = root<br> sum_ = 0<br> while curr or stack:<br> while curr:<br> stack.append(curr)<br> curr = curr.right<br> curr = stack.pop()<br> sum_ += curr.val<br> curr.val = sum_<br> curr = curr.left<br> return root
递归
class Solution:<br> def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:<br> self.pre = 0<br> def dfs(root):<br> if not root:<br> return<br> dfs(root.right)<br> root.val += self.pre<br> self.pre = root.val<br> dfs(root.left)<br> dfs(root)<br> return root
二叉树的公共祖先
236二叉树的最近公共祖先
递归法(后序遍历)
class Solution:<br> def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':<br> if root == p or root == q or not root:<br> return root<br> left = self.lowestCommonAncestor(root.left, p, q)<br> right = self.lowestCommonAncestor(root.right, p, q)<br> if left and right:<br> return root<br> elif not left and right:<br> return right<br> elif not right and left:<br> return left<br> else: # left=None and right=None<br> return None
236二叉搜索树的最近公共祖先
递归法
class Solution:<br> def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':<br> if root.val < q.val and root.val < p.val:<br> return self.lowestCommonAncestor(root.right, p, q)<br> elif root.val > q.val and root.val > p.val:<br> return self.lowestCommonAncestor(root.left, p, q)<br> else:<br> return root
迭代法
class Solution:<br> def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':<br> if p.val < q.val:<br> p, q = q, p<br> while root:<br> if p.val <= root.val <= q.val:<br> return root<br> elif root.val > q.val:<br> root = root.left<br> elif root.val < p.val:<br> root = root.righ
二叉搜索树的修改与构造
701二叉搜索树中的插入操作
递归法
class Solution:<br> def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:<br> if not root:<br> return TreeNode(val)<br> if val > root.val:<br> root.right = self.insertIntoBST(root.right, val)<br> if val < root.val:<br> root.left = self.insertIntoBST(root.left, val)<br> return root
迭代法
class Solution:<br> def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:<br> if not root:<br> return TreeNode(val)<br> ret = root<br> while root:<br> pre = root<br> if val > root.val:<br> root = root.right<br> elif val < root.val:<br> root = root.left<br> if pre.val > val:<br> pre.left = TreeNode(val)<br> if pre.val < val:<br> pre.right= TreeNode(val)<br> return ret
450删除二叉搜索树中的节点
递归
class Solution:<br> def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:<br> if not root:<br> return None<br> if root.val == key:<br> if not root.left:<br> return root.right<br> elif not root.right:<br> return root.left<br> else:<br> temp = root<br> root = root.right<br> while root.left:<br> root = root.left<br> root.left = temp.left<br> return temp.right<br> if key < root.val:<br> root.left = self.deleteNode(root.left, key)<br> elif key > root.val:<br> root.right = self.deleteNode(root.right, key)<br> return root
669修剪二叉搜索树
递归
class Solution:<br> def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:<br> if not root:<br> return None<br> if root.val < low:<br> return self.trimBST(root.right, low, high)<br> if root.val > high:<br> return self.trimBST(root.left, low, high)<br> root.left = self.trimBST(root.left, low, high)<br> root.right = self.trimBST(root.right, low, high)<br> return root
108将有序数组转换为二叉搜索树
递归
class Solution:<br> def sortedArrayToBST(self, nums: List[int]) -> TreeNode:<br> if not nums:<br> return None<br> if len(nums) == 1:<br> return TreeNode(nums[0])<br> mid = len(nums) // 2<br> root = TreeNode(nums[mid])<br> root.left = self.sortedArrayToBST(nums[:mid])<br> root.right = self.sortedArrayToBST(nums[mid+1:])<br> return root
0 条评论
下一页