# 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.res = list() deftraversal(self, nums: List[int]) -> Optional[TreeNode]: L = len(nums) # 终止条件是:发现叶子节点就直接返回 if L == 1: return TreeNode(nums[0])
# 找最大值 maxIndex = 0 for i inrange(L): if nums[i] >= nums[maxIndex]: maxIndex = i root = TreeNode(nums[maxIndex]) # 注意,maxIndex至少要有左子树和右子树 if maxIndex > 0: leftTree = self.traversal(nums[:maxIndex]) root.left = leftTree if maxIndex < L - 1: rightTree = self.traversal(nums[maxIndex + 1:]) root.right = rightTree return root
defconstructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]: # 注意层序顺序返回结果 from collections import deque que = deque()
# 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: defisValidBST(self, root: Optional[TreeNode]) -> bool: # 按中序遍历,输出的应该是单调增长的
stack = [(root, False)] if root else [] res = list() while stack: node, visited = stack.pop() if visited: res.append(node.val) else: if node.right: stack.append([node.right, False]) stack.append([node, True]) if node.left: stack.append([node.left, False]) #print(res) #rturn all(x < y for x, y in zip(res, res[1:])) maxIndex = 0 L = len(res) for i inrange(1, L): if res[i] > res[maxIndex]: maxIndex = i else: returnFalse returnTrue
stack = [(root, False)] if root else [] pre = None while stack: node, visited = stack.pop() if visited: if pre and pre.val >= node.val: returnFalse pre = node else: if node.right: stack.append([node.right, False]) stack.append([node, True]) if node.left: stack.append([node.left, False]) returnTrue
普通中序迭代代码三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
stack = list() cur = root pre = None # cur先一路干到最底层的左子树左叶子节点 while cur or stack: if cur: stack.append(cur) cur = cur.left # 到达最左节点后,开始处理栈顶节点 else: # 最底层的左子树左叶子节点开始输出,append到 cur = stack.pop() if pre and cur.val <= pre.val: returnFalse pre = cur # 取栈顶元素右节点 cur = cur.right returnTrue
defmergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: # 迭代版,使用层序 from collections import deque que = deque() ifnot root1: return root2 ifnot root2: return root1 que.append(root1) que.append(root2) while que: L = len(que) node1 = que.popleft() node2 = que.popleft()
node1.val += node2.val
if node1.left and node2.left: que.append(node1.left) que.append(node2.left) if node1.right and node2.right: que.append(node1.right) que.append(node2.right)
ifnot node1.left and node2.left: node1.left = node2.left
ifnot node1.right and node2.right: node1.right = node2.right
# 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: defzigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: # 先全添加到level,再按奇偶反转level内部,再添加到res from collections import deque que = deque() ifnot root: return [] que.append(root) res = list() countLevel = 1 while que: L = len(que) level = list() for i inrange(L): node = que.popleft() level.append(node.val) if node.left: que.append(node.left) if node.right: que.append(node.right) if countLevel % 2 == 0: level = level[::-1] res.append(level) countLevel += 1 return res