二叉树的遍历
定义:
遍历是数据结构中的常见操作把所有元素都访问一遍
线性数据结构的遍历比较简单分为:正序遍历和逆序遍历
根据结点访问顺序的不同,二叉树的常见遍历方式有4种
前序遍历(Preorder Traversal)
中序遍历(inorder Traversal)
后序遍历(Postorder Traversal)
层序遍历(Level Order Traversal)
前序遍历
- 访问顺序
- 根结点、前序遍历左子树、前序遍历右子树
- 7、4、2、1、3、5、9、8、11、10、12
类似递归
/**
* 前序遍历
*/
@SuppressWarnings("unused")
// 公开的方法
public void preorderTravesal() {
preorderTravesal(rootNode);
}
// 私有的方法
private void preorderTravesal(Node<E> node) {
if(node == null) return;
System.out.println(node.element);
preorderTravesal(node.liftnode);
preorderTravesal(node.rightnode);
}
public static void main(String[] args) {
BinarySearchTree <Integer> bst3 = new BinarySearchTree<>();
Integer data[] = new Integer[] {
7,4,2,1,3,5,9,8,11,10,12
};
for(int i = 0 ; i < data.length; i++) {
bst3.add(data[i]);
}
bst3.preorderTravesal();
中序遍历
- 访问顺序
- 中序遍历左子树、根结点、中序遍历右子树
- 1、2、3、4、5、7、8、9、10、11、12
- 1、2、3、4、5、7、8、9、10、11、12
- 如果访问顺序是下面这样呢?
- 中序遍历右子树、根结点、中序遍历左子树
- 12、11、10、9、8、7、5、4、3、2、1
- 二叉搜索树中序遍历的结果是升序或降序的
- 中序遍历左子树、根结点、中序遍历右子树
/**
* 中序遍历
*/
@SuppressWarnings("unused")
// 公开的方法
public void inorderTravesal() {
inorderTravesal(rootNode);
}
// 私有的方法
private void inorderTravesal(Node<E> node) {
if(node == null) return;
inorderTravesal(node.liftnode);
System.out.println(node.element);
inorderTravesal(node.rightnode);
}
后序遍历
- 访问顺序
- 后序遍历左子树、后序遍历右子树、根结点
- 1、3、2、5、4、8、10、12、11、9、7
- 后序遍历左子树、后序遍历右子树、根结点
/**
* 后序遍历
*/
@SuppressWarnings("unused")
// 公开的方法
public void psotorderTravesal() {
psotorderTravesal(rootNode);
}
// 私有的方法
private void psotorderTravesal(Node<E> node) {
if(node == null) return;
// 先左再右后自身
psotorderTravesal(node.liftnode);
psotorderTravesal(node.rightnode);
System.out.println(node.element);//自身
}
后序遍历
- 访问顺序
- 从上到下、从左到右依次访问每一个结点
- 7、4、9、2、5、8、11、1、3、10、12
- 实现思路:使用队列(先入先出)
1.将根结点入队
2.循环执行以下操作,直到队列为空- 将队头结点A出队,进行访问
- 将A的左子节点入队
- 将A的右子节点入队