二叉树的遍历分为:
深度优先搜索(Depth First Search)
是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。深度优先搜索二叉树是先访问根结点,然后遍历左子树接着是遍历右子树,因此我们可以利用堆栈的先进后出的特点,先将右子树压栈,再将左子树压栈,这样左子树就位于栈顶,可以保证结点的左子树先与右子树被遍历。
广度优先搜索(Breadth First Search)
是从根结点开始沿着树的宽度搜索遍历,可以利用队列实现广度优先搜索
二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列
深度优先实现
深度优先遍历又分为:前序、中序、后序遍历
- 前序遍历:根节点->左子树->右子树
- 中序遍历:左子树->根节点->右子树
- 后序遍历:左子树->右子树->根节点
note: 二叉搜索树BST的中序遍历,返回的结果是按顺序排列的
递归实现
前序遍历伪代码:
1 | preorder(node) |
根节点->左子树->右子树
python实现
1 | def preorder(self, node): |
中序遍历伪代码:
1 | inorder(node) |
左子树->根节点->右子树
1 | def inorder(self, node): |
后序遍历伪代码:
1 | postorder(node) |
左子树->右子树->根节点
1 | def postorder(self, node): |
非递归实现
因为当遍历过根节点之后还要回来,所以必须将其存起来。考虑到后进先出的特点,选用栈存储。
前序遍历伪代码:
1 | iterativePreorder(node) |
1 | def preorderTraversal__iterative(root): |
中序遍历伪代码:
1 | iterativeInorder(node) |
1 | def inorderTraversal_iterative(root): |
后序遍历
后序遍历伪代码:
1 | iterativePostorder(node) |
1 | def postorderTraversal(node): |
广度优先实现
伪代码
1 | levelorder(root) |