二叉树遍历
二叉树遍历非递归实现
目录
二叉树遍历非递归实现
树节点定义:
先序遍历:
中序遍历:
后序遍历:
测试代码:
先序遍历测试代码:
中序遍历测试代码:
后序遍历测试代码:
树节点定义:
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;}
}
先序遍历:
/*** 前序遍历二叉树* @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;}
中序遍历:
/*** 中序遍历二叉树* @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;}
后序遍历:
/*** 后序遍历二叉树* @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;}
层序遍历:
/*** 层序遍历二叉树* @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;}
测试代码:
先序遍历测试代码:
/*** 测试前序遍历*/@Testpublic 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);}
中序遍历测试代码:
/*** 测试中序遍历*/@Testpublic 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);}
后序遍历测试代码:
/*** 测试后序遍历*/@Testpublic 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);}
层序遍历测试代码:
/*** 测试层序遍历*/@Testpublic 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);}
注:深度优先搜索策略与广度优先搜索策略暂不在本文探讨范围。