二叉树的遍历
先序遍历
先输入父节点,再遍历左子树和右子树:A、B、D、E、C、F、G
中序遍历
先遍历左子树,再输出父节点,再遍历右子树:D、B、E、A、F、C、G
后序遍历
先遍历左子树,再遍历右子树,最后输入父节点:D、E、B、F、G、C、A
核心理论
- 根据父节点的输出顺序来确定先序、中序、后续。
- 采用递归的方式对左子树和右子树进行遍历。
- 每次递归都是一个方法的入栈操作,直至到最后一个子节点为空的时候,执行方法,然后方法栈弹出。
- 每个方法栈弹出后,开始执行下一个方法栈,以此类推,相应的方法则可输出。
代码实现
package org.example.data.structure.basetree;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** @author xzy* @since 2024/9/16 15:14*/
public class PersonNode {private static final List<Person> PRE_ORDER_LIST = new ArrayList<>();private static final List<Person> MID_ORDER_LIST = new ArrayList<>();private static final List<Person> POST_ORDER_LIST = new ArrayList<>();private Person data;private PersonNode left;private PersonNode right;public PersonNode() {}public PersonNode(Person person) {this.data = person;}public PersonNode(Person data, PersonNode left, PersonNode right) {this.data = data;this.left = left;this.right = right;}/*** 前序遍历*/public List<Person> preOrder() {PRE_ORDER_LIST.add(this.getData());if (Objects.nonNull(this.getLeft())) {this.getLeft().preOrder();}if (Objects.nonNull(this.getRight())) {this.getRight().preOrder();}return PRE_ORDER_LIST;}/*** 中序遍历*/public List<Person> midOrder() {if (Objects.nonNull(this.getLeft())) {this.getLeft().midOrder();}MID_ORDER_LIST.add(this.getData());if (Objects.nonNull(this.getRight())) {this.getRight().midOrder();}return MID_ORDER_LIST;}/*** 后续遍历*/public List<Person> postOrder() {if (Objects.nonNull(this.getLeft())) {this.getLeft().postOrder();}if (Objects.nonNull(this.getRight())) {this.getRight().postOrder();}POST_ORDER_LIST.add(this.getData());return POST_ORDER_LIST;}public Person getData() {return data;}public void setData(Person data) {this.data = data;}public PersonNode getLeft() {return left;}public void setLeft(PersonNode left) {this.left = left;}public PersonNode getRight() {return right;}public void setRight(PersonNode right) {this.right = right;}
}
源码与测试案例
gitee地址