1.二叉树遍历:深度优先遍历
1.1 简述
二叉树的遍历包括深度优先遍历和广度优先遍历。其中广度优先遍历则是一层一层的遍历二叉树;而深度优先遍历则是从根节点开始沿着一条链路一直访问下去,直到没有节点为止然后回到上一个节点按照另一条链路开始访问知道遍历所有节点为止;
1.2 深度优先遍历
这里重点介绍深度优先遍历,深度优先遍历又按照根节点的访问顺序分为先根遍历和后根遍历以及中根遍历;
以上图二叉树为例,先根遍历(根节点–左节点–右节点)的结果就是:124563,而后根遍历(左节点–右节点–根节点)的结果就是:452631,中根遍历(左节点-根节点-右节点)的结果就是425136
1.3 前期代码准备(节点实体类)
//节点类
@Getter
@Setter
public class TreeNode<T> {
private T value,
//左孩子节点
private TreeNode<T> leftChild;
//右孩子节点
private TreeNode<T> rightChild;
}
1.4 递归实现深度优先遍历
public class Test {
//先根遍历
public <T> List<T> preorderTraversal(TreeNode<T> node) {
List<T> res = new ArrayList();
if (null == node) {
return res;
}
res.add(node.getValue());
res.addAll(preorderTraversal(node.getLeftChild()));
res.addAll(preorderTraversal(node.getRightChild()));
}
//中根遍历
public <T> List<T> inorderTraversal(TreeNode<T> node) {
List<T> res = new ArrayList();
if (null == node) {
return res;
}
res.addAll(preorderTraversal(node.getLeftChild()));
res.add(node.getValue());
res.addAll(preorderTraversal(node.getRightChild()));
}
//后根遍历
public <T> List<T>postorderTraversal(TreeNode<T> node) {
List<T> res = new ArrayList();
if (null == node) {
return res;
}
res.addAll(preorderTraversal(node.getLeftChild()));
res.addAll(preorderTraversal(node.getRightChild()));
res.add(node.getValue());
}
}