二叉树遍历
前序:根左右
中序:左根右
后序:左右根
深度优先
前序遍历
144. 二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,2,3]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
self.preorder(root,res)
return res
def preorder(self,root,res):
if root:
res.append(root.val)
if root.left:
self.preorder(root.left,res)
if root.right:
self.preorder(root.right,res)
#栈
#根左右,先将根节点入栈,在依次入右节点、左节点
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
stack.append(root) #根节点入栈
while stack:
root = stack.pop()
if root:
res.append(root.val)
stack.append(root.right)
stack.append(root.left)
return res
中序遍历
94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,3,2]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#递归
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
self.helper(root,res)
return res
def helper(self,root,res):
if root:
if root.left:
self.helper(root.left,res)
res.append(root.val)
if root.right:
self.helper(root.right,res)
#使用栈
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
cur = root
while cur or stack:
while cur:
stack.append(cur)
cur = cur.left
cur = stack.pop()
res.append(cur.val)
cur = cur.right
return res
后序遍历
145. 二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [3,2,1]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = []
def postorder(root):
if root:
if root.left:
postorder(root.left)
if root.right:
postorder(root.right)
res.append(root.val)
postorder(root)
return res
#栈
#根左右 转换为 根右左 逆序为 左右根
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = []
stack.append(root)
while stack:
root = stack.pop()
res.append(root.val)
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
return res[::-1]
广度优先
层次遍历
102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
#按照每层遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res,queue = [],[]
queue.append([root])
res.append([root.val])
while queue:
root = queue.pop(0)
level,level_node = [],[]
for node in root:
if node.left:
level_node.append(node.left)
level.append(node.left.val)
if node.right:
level_node.append(node.right)
level.append(node.right.val)
if level_node:
queue.append(level_node)
if level:
res.append(level)
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res,queue = [],[]
queue.append([root])
level = 0
while queue:
root = queue.pop(0)
res.append([])
level_node = []
for node in root:
res[level].append(node.val)
if node.left:
level_node.append(node.left)
if node.right:
level_node.append(node.right)
if level_node:
queue.append(level_node)
level += 1
return res