def addOneRow(self, root, v, d): """ :type root: TreeNode :type v: int :type d: int :rtype: TreeNode """ def helper(root, v, d, level): if not root: return if level + 1 == d: node_left = TreeNode(v) node_left.left = root.left root.left = node_left node_right = TreeNode(v) node_right.right = root.right root.right = node_right return helper(root.left, v, d, level + 1) helper(root.right, v, d, level + 1) if d == 1: node = TreeNode(v) node.left = root return node helper(root, v, d, 1) return root
def reConstructBinaryTree(self, pre, tin): if len(pre) == 0: return root = TreeNode(pre[0]) tinIndex = tin.index(pre[0]) root.left = self.reConstructBinaryTree(pre[1:tinIndex + 1], tin[:tinIndex]) root.right = self.reConstructBinaryTree(pre[tinIndex + 1:], tin[tinIndex + 1:]) return root
def helper(root, v, d, level): if not root: return if level + 1 == d: node_left = TreeNode(v) node_left.left = root.left root.left = node_left node_right = TreeNode(v) node_right.right = root.right root.right = node_right return helper(root.left, v, d, level + 1) helper(root.right, v, d, level + 1)
def dfs(self, left, right): res = [] if left > right: return [None] for i in range(left, right+1): left_nodes = self.dfs(left, i-1) right_nodes = self.dfs(i+1, right) for left_node in left_nodes: for right_node in right_nodes: node = TreeNode(i) node.left = left_node node.right = right_node res.append(node) return res
def buildTree(self, inorder, postorder): """ :type inorder: List[int] :type postorder: List[int] :rtype: TreeNode """ if not postorder: return None root = TreeNode(postorder[-1]) # 后序中最后肯定是根结点 root_index = inorder.index(root.val) root.left = self.buildTree(inorder[:root_index], postorder[:root_index]) #左闭右开 root.right = self.buildTree(inorder[root_index + 1:], postorder[root_index:-1]) return root
if not root: return 0 return max(self.maxDepth1(root.left), self.maxDepth1(root.right)) + 1 def maxDepth2(self, root): ''' BFS ''' if not root: return 0 que = [] que.append((root, 1)) while que: cur, depth = que.pop(0) if cur.left != None: que.append((cur.left, depth + 1)) if cur.right != None: que.append((cur.right, depth + 1)) return depth def maxDepth(self, root): return self.maxDepth2(root) if __name__ == '__main__': s = Solution() root = TreeNode(3) root.left = TreeNode(9) root.right = TreeNode(20) root.right.left = TreeNode(15) root.right.right = TreeNode(7) print(s.maxDepth(root))
if not res: res = self.HasSubtree(pRoot1.left, pRoot2) # A树的左节点中有没有 if not res: res = self.HasSubtree(pRoot1.right, pRoot2) # A树的右节点中有没有 return res def isSubtree(self, root1, root2): if not root2: return True if not root1: return False if root1.val == root2.val: return self.isSubtree(root1.left, root2.left) and self.isSubtree(root1.right, root2.right) else: return False if __name__ == '__main__': s = Solution() a = TreeNode(8) a.left = TreeNode(8) a.left.left = TreeNode(9) a.left.left.left = TreeNode(9) a.left.right = TreeNode(2) a.right = TreeNode(7) b = TreeNode(8) b.left = TreeNode(9) b.right = TreeNode(2) print(s.HasSubtree(a, b))