二叉树遍历非递归实现
目录
树节点定义:
java
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
先序遍历:
java
/**
* 前序遍历二叉树
* @param root
* @return
*/
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new LinkedList<>();
while (root != null || !stack.isEmpty()) {
if (root != null) {
// 先访问根节点
list.add(root.val);
stack.push(root);
// 然后访问左子树
root = root.left;
} else {
// 如果没有左子树,访问右子树
root = stack.pop();
root = root.right;
}
}
return list;
}
中序遍历:
java
/**
* 中序遍历二叉树
* @param root
* @return
*/
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new LinkedList<>();
while (root != null || !stack.isEmpty()) {
if (root!=null){
stack.push(root);
//先访问左子树
root = root.left;
}else {
root = stack.pop();
//访问根节点
list.add(root.val);
//访问右子树
root = root.right;
}
}
return list;
}
后序遍历:
java
/**
* 后序遍历二叉树
* @param root
* @return
*/
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new LinkedList<>();
// 记录上一个访问的节点
TreeNode lastVisited = null;
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);
// 先访问左子树
root = root.left;
} else {
TreeNode peekNode = stack.peek();
// 如果右子树不存在或已经被访问过,则访问当前节点
if (peekNode.right == null || peekNode.right == lastVisited) {
list.add(peekNode.val);
// 更新上一个访问的节点
lastVisited = stack.pop();
} else {
// 否则访问右子树
root = peekNode.right;
}
}
}
return list;
}
层序遍历:
java
/**
* 层序遍历二叉树
* @param root
* @return
*/
public List<Integer> levelorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
// 如果根节点为空,直接返回空列表
if (root == null) {
return list;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
return list;
}
测试代码:
先序遍历测试代码:
java
/**
* 测试前序遍历
*/
@Test
public void testPreorderTraversal() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
BinaryTree binaryTree = new BinaryTree();
List<Integer> result = binaryTree.preorderTraversal(root);
// 输出: [1, 2, 4, 5, 3]
System.out.println(result);
}
中序遍历测试代码:
java
/**
* 测试中序遍历
*/
@Test
public void testInorderTraversal() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
BinaryTree binaryTree = new BinaryTree();
List<Integer> result = binaryTree.inorderTraversal(root);
// 输出: [4, 2, 5, 1, 3]
System.out.println(result);
}
后序遍历测试代码:
java
/**
* 测试后序遍历
*/
@Test
public void testPostorderTraversal() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
BinaryTree binaryTree = new BinaryTree();
List<Integer> result = binaryTree.postorderTraversal(root);
// 输出: [4, 5, 2, 3, 1]
System.out.println(result);
}
层序遍历测试代码:
java
/**
* 测试层序遍历
*/
@Test
public void testLevelorderTraversal() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
BinaryTree binaryTree = new BinaryTree();
List<Integer> result = binaryTree.levelorderTraversal(root);
// 输出: [1, 2, 3, 4, 5]
System.out.println(result);
}
注:深度优先搜索策略与广度优先搜索策略暂不在本文探讨范围。