Java 二叉树遍历实现 - 前序、中序、后序、层序遍历
import java.util.*;
public class BinaryTree<T> {
private final BinaryNode<T> root;
public BinaryTree(BinaryNode<T> root) {
this.root = root;
}
public List<T> preOrder() {
List<T> result = new ArrayList<>();
preOrderTraversal(root, result);
return result;
}
private void preOrderTraversal(BinaryNode<T> node, List<T> result) {
if (node == null)
return;
result.add(node.getVal());
preOrderTraversal(node.getLeft(), result);
preOrderTraversal(node.getRight(), result);
}
public List<T> inOrder() {
List<T> result = new ArrayList<>();
inOrderTraversal(root, result);
return result;
}
private void inOrderTraversal(BinaryNode<T> node, List<T> result) {
if (node == null)
return;
inOrderTraversal(node.getLeft(), result);
result.add(node.getVal());
inOrderTraversal(node.getRight(), result);
}
public List<T> postOrder() {
List<T> result = new ArrayList<>();
postOrderTraversal(root, result);
return result;
}
private void postOrderTraversal(BinaryNode<T> node, List<T> result) {
if (node == null)
return;
postOrderTraversal(node.getLeft(), result);
postOrderTraversal(node.getRight(), result);
result.add(node.getVal());
}
public List<T> levelOrder() {
List<T> result = new ArrayList<>();
if (root == null)
return result;
Queue<BinaryNode<T>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
BinaryNode<T> node = queue.poll();
result.add(node.getVal());
if (node.getLeft() != null)
queue.offer(node.getLeft());
if (node.getRight() != null)
queue.offer(node.getRight());
}
return result;
}
public List<T> inOrderNonRecur() {
List<T> result = new ArrayList<>();
if (root == null)
return result;
Stack<BinaryNode<T>> stack = new Stack<>();
BinaryNode<T> curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.getLeft();
}
curr = stack.pop();
result.add(curr.getVal());
curr = curr.getRight();
}
return result;
}
}
上述代码中,我们定义了BinaryTree类,它有一个泛型参数T,并接受一个BinaryNode类型的根节点作为构造函数的参数。类中包含了前序遍历、中序遍历、后序遍历、层序遍历和非递归中序遍历的方法。
在代码中,我们使用递归方式实现了前序遍历、中序遍历和后序遍历。而层序遍历则利用队列来进行广度优先搜索的方式实现。非递归中序遍历则利用栈来模拟递归的过程。
以上是对您提供的代码进行了补充和完善,使其实现了所需的二叉树遍历方法。
原文地址: https://www.cveoy.top/t/topic/Xmt 著作权归作者所有。请勿转载和采集!