马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
二叉树遍历非递归实现
目次
二叉树遍历非递归实现
树节点界说:
先序遍历:
中序遍历:
后序遍历:
测试代码:
先序遍历测试代码:
中序遍历测试代码:
后序遍历测试代码:
树节点界说:
- 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;
- }
复制代码 测试代码:
先序遍历测试代码:
- /**
- * 测试前序遍历
- */
- @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);
- }
复制代码 中序遍历测试代码:
- /**
- * 测试中序遍历
- */
- @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);
- }
复制代码 后序遍历测试代码:
- /**
- * 测试后序遍历
- */
- @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);
- }
复制代码 层序遍历测试代码:
- /**
- * 测试层序遍历
- */
- @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);
- }
复制代码 注:深度优先搜索计谋与广度优先搜索计谋暂不在本文探究范围。
|