二叉树特点是每个结点最多只能有两棵子树,且有左右之分。二叉树的遍历策略主要有两种,一种是深度优先遍历,一种是广度优先遍历(也叫宽度优先遍历)。
python3 定义二叉树结构:
# 定义二叉树的结构,定义根节点和左右子节点
class TreeNode(object):
""" Definition of a binary tree node."""
def __init__(self, x):
self.val = x
self.left = None
self.right = None
创建一个二叉树:
root = TreeNode("F")
root.left = TreeNode("B")
root.left.left = TreeNode("A")
root.left.right = TreeNode("D")
root.left.right.left = TreeNode("C")
root.left.right.right = TreeNode("E")
root.right = TreeNode("G")
root.right.right = TreeNode("I")
root.right.right.left = TreeNode("H")
这个二叉树长这个样子:
(1)深度优先搜索(DFS)
在这个策略中,我们采用深度
作为优先级,从根节点开始一直到达某个叶子节点,然后再到另外一个分支。深度优先搜索根据根节点被搜索的次序可以分为前序遍历,中序遍历和后续遍历。
1)前序遍历,先访问根节点,然后遍历左子树,最后遍历右子树。
访问的顺序为:FBADCEGIH
前序遍历采用递归的方法:
def preorderTraversal(self, root: TreeNode) -> List[int]:
preorder = []
def helper(root):
if not root: # 终止条件
return None
preorder.append(root.val)
helper(root.left) # 先判断左子树,直到最找不到节点