前言
昨天在看Leetcode上《二叉树》部分的书籍,做了四道关于二叉树的遍历的题目,在此总结一下二叉树的三种遍历方式及其实现。
二叉树的遍历
二叉树的遍历可以分为:前序遍历、中序遍历、后序遍历、层次遍历四种。以下面这一个二叉树为例:
- 前序遍历:首先访问二叉树的根节点,再访问左子树,最后访问右子树。前序遍历的结果为:
F-C-A-D-B-E-H-G-M
- 中序遍历:首先访问二叉树的左子树,再访问根节点,最后访问右子树。中序遍历的结果为:
A-C-B-D-F-H-E-M-G
- 后序遍历:首先访问二叉树的左子树,再访问右子树,最后访问根节点。后序遍历的结果为:
A-B-D-C-H-M-G-E-F
- 层次遍历:依次访问二叉树的每一层。层次遍历的结果为:
F-C-E-A-D-H-G-B-M
二叉树遍历的递归方法
前序遍历
- 首先访问二叉树的根节点,访问到根节点就直接输出该节点的值。
- 如果有左子树,就按照相同的方式访问左子树。
- 如果有右子树就按照相同的方式访问右子树。
# 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: TreeNode) -> List[int]:
# Solution1: 递归
result = []
def traverse(root):
if not root:
return
result.append(root.val)
traverse(root.left)
traverse(root.right)
traverse(root) #在不断 result
return result
中序遍历
- 对于一棵二叉树,先判断该节点有没有左子树
- 如果有左子树,就先访问左子树
- 访问根节点的值并输出
- 访问右子树
# 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 inorderTraversal(self, root: TreeNode