# 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 class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = []
def recursion(node): if node != None: res.append(node.val) recursion(node.left) recursion(node.right) recursion(root) return res
# 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 class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = []
stack = [root]
while len(stack) != 0: cur = stack.pop() if cur != None: res.append(cur.val) stack.append(cur.right) stack.append(cur.left) return res
中序遍历
前序遍历的顺序是中左右,先访问的元素是中间节点(子节点分别放到栈中),先处理的元素也是中间节点(将 val 存入 res),所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。
对于当前栈顶节点节点,一直遍历左子树,直到为空(访问左);然后,将 val 存入 res(处理中);最后再将当前节点的右子树放到栈中(访问右)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] stack = [] cur = root while True: while cur != None: stack.append(cur) cur = cur.left if len(stack) == 0: break cur = stack.pop() res.append(cur.val) cur = cur.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 class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = []
stack = [] if root != None: stack.append((root, False))
while len(stack) != 0: cur, flag = stack.pop() if flag == False: if cur.right: stack.append((cur.right, False)) if cur.left: stack.append((cur.left, False)) stack.append((cur, True))
class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: que = deque() res = [] if root: que.append(root) while que: cur = que.popleft()
res.append(cur.val)
if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) return res
不难写出以上代码,但是注意到题目要求每一层的节点在单独的一个 list 中。解决方法,保证每次循环(que 长度不为 0)时,队列中只有一层的节点,所以可以一次性把当前层的所有子节点全部放到队列中。只需要对当前队列进行遍历即可。
class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: que = deque() res = [] if root: que.append(root) while que: cur_level = [] for _ in range(len(que)):
cur = que.popleft()
cur_level.append(cur.val)
if cur.left: que.append(cur.left) if cur.right: que.append(cur.right)
class Solution: def rightSideView(self, root: Optional[TreeNode]) -> List[int]: que = deque() res = [] count = 0 if root: que.append(root) count += 1 while que: l = len(que) for i in range(len(que)):
cur = que.popleft() if i == l - 1: res.append(cur.val)
if cur.left: que.append(cur.left) if cur.right: que.append(cur.right) return res