一、前序遍历、中序遍历和后序遍历
使用递归方法,只需改变返回数据顺序即可
class Solution:
def preorderTraversal(self, root): ##前序遍历
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
return [root.val] + self.inorderTraversal(root.left) + self.inorderTraversal(root.right)
def inorderTraversal(self, root): ##中序遍历
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
def postorderTraversal(self, root): ##后序遍历
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
return self.inorderTraversal(root.left) + self.inorderTraversal(root.right) + [root.val]
二、层次遍历
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
方法:广度优先遍历 深度优先遍历
广度优先遍历
广度优先遍历是按层层推进的方式,遍历每一层的节点。
中心思想:使用辅助队列,遍历每一层节点,将该层节点送入队列中,再取出存到一个列表中,不断重复该过程,得到二叉树的所有节点。
代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
if not root:
return []
queue = []
result = []
queue.append(root)
while len(queue) > 0:
node = queue.pop(0)
result.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result
if __name__ == '__main__':
s = Solution()
res = s.PrintFromTopToBottom([1, 2, 3])
print(res)
深度优先遍历
深度优先遍历是尽可能深的去遍历每个节点的左右子树。
中心思想:使用递归函数进行层次遍历需要有一个参数level,该参数表示当前结点的层数。遍历的结果返回到一个二维列表sol中,sol中的每一个子列表保存了对应index层的从左到右的所有结点value值。
例如:[1,2,3],对于根节点1来说,2和3是它的左右子树。首先遍历第一层的节点1,二维列表sol为[ [1] , [ ] ],然后递归遍历1的左右子节点。遍历第二层的节点2,得到二维列表sol为[ [1] , [2], [ ]],然后遍历2的左右子节点,由于2没有左右子节点,则返回空,此时sol为[ [1] , [2]]。再遍历第二层的节点3,同上,最后得到所有节点。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
def helper(node, level):
if not node:
return
else:
sol[level-1].append(node.val)
if len(sol) == level: # 遍历到新层时,只有最左边的结点使得等式成立
sol.append([])
helper(node.left, level+1)
helper(node.right, level+1)
sol = [[]]
helper(root, 1)
a = []
while sol:
a += sol.pop(0)
return a
if __name__ == '__main__':
s = Solution()
res = s.PrintFromTopToBottom([1, 2, 3])
print(res)