在刷《剑指offer》的过程中做到关于二叉树的题目,顺便将leetcode上二叉树的遍历相关的代码复习一遍:
- 先序遍历(递归+非递归)
- 中序遍历(递归+非递归)
- 后序遍历(递归+非递归)
- 层次遍历
二叉树先序遍历
- 递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.preorder_list = []
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root:
self.preorder_list.append(root.val)
self.preorderTraversal(root.left)
self.preorderTraversal(root.right)
return self.preorder_list
- 非递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
preorder_list = []
node_list = []
if root:
node = root
while node_list or node:
while node:
preorder_list.append(node.val)
node_list.append(node)
node = node.left
node = node_list.pop()
node = node.right
return preorder_list
二叉树中序遍历
- 递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.inorder_list = []
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root:
self.inorderTraversal(root.left)
self.inorder_list.append(root.val)
self.inorderTraversal(root.right)
return self.inorder_list
- 非递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
inorder_list = []
node_list = []
node = root
if node:
while node_list or node:
while node:
node_list.append(node)
node = node.left
node = node_list.pop()
inorder_list.append(node.val)
node = node.right
return inorder_list
二叉树后序遍历
- 递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.postorder = []
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root:
self.postorderTraversal(root.left)
self.postorderTraversal(root.right)
self.postorder.append(root.val)
return self.postorder
- 非递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
postorder_list = []
node_list = []
node_queue = []
node = root
if root:
while node or node_list:
while node:
node_list.append(node)
node_queue.append(node)
node = node.right
node = node_list.pop()
node = node.left
while node_queue:
postorder_list.append(node_queue.pop().val)
return postorder_list
二叉树层次遍历
- 非递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
level_order = []
if not root:
return level_order
node_queue = [root]
while node_queue:
cnt = len(node_queue)
tmp = []
while cnt > 0:
node = node_queue.pop(0)
tmp.append(node.val)
if node.left:
node_queue.append(node.left)
if node.right:
node_queue.append(node.right)
cnt -= 1
level_order.append(tmp)
return level_order