不使用递归遍历二叉树

不使用递归,想要遍历二叉树,只能通过循环来实现。不是所有的递归都能转化为循环,但这个遍历可以转换。使用循环遍历二叉树还必须使用栈进行回溯算法。下面给出示例代码:

import java.util.Stack;

public class AnswerB13 {

	public static void main(String[] args) {
		Node tree = makeupTree();
		Stack<Node> stack = new Stack<Node>();
		Node currentNode = tree;
		while (currentNode != null) {
			System.out.println(currentNode.value);
			stack.push(currentNode);
			currentNode = currentNode.left;
			if (currentNode == null) {
				Node parent = stack.pop();
				currentNode = parent.right;
				if (currentNode == null) {
					if (stack.isEmpty()) {
						break;
					}
					Node parentParent = stack.pop();
					currentNode = parentParent.right;
				}
			}
		}
	}

	private static Node makeupTree() {
		Node root = new Node(0);
		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node11 = new Node(11);
		Node node12 = new Node(12);
		Node node21 = new Node(21);
		Node node22 = new Node(22);

		root.left = node1;
		root.right = node2;

		node1.left = node11;
		node1.right = node12;

		node2.left = node21;
		node2.right = node22;
		return root;
	}

	public static class Node {
		public Node left;
		public Node right;
		public int value;

		public Node(int value) {
			this.value = value;
		}
	}
}

 

一、递归遍历二叉树的设计思想 递归遍历二叉树是一种常用的方法,它可以通过简单的代码实现对二叉树遍历操作。递归遍历二叉树的基本思想是:先访问当前节点,然后再递归遍历左子树和右子树。具体实现可以分为前序遍历、中序遍历和后序遍历三种。 1. 前序遍历 前序遍历的实现思路是:先访问当前节点,然后再递归遍历左子树和右子树。具体实现代码如下: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) return; visit(root); preorderTraversal(root->left); preorderTraversal(root->right); } ``` 2. 中序遍历 中序遍历的实现思路是:先递归遍历左子树,然后访问当前节点,最后再递归遍历右子树。具体实现代码如下: ``` void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); visit(root); inorderTraversal(root->right); } ``` 3. 后序遍历 后序遍历的实现思路是:先递归遍历左子树,然后再递归遍历右子树,最后访问当前节点。具体实现代码如下: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); visit(root); } ``` 递归遍历二叉树的优点是代码简单,易于理解,但是它也有一些缺点。递归遍历二叉树需要使用函数调用栈,如果二叉树的深度较大,就会导致栈溢出。此外,递归遍历二叉树的效率如非递归遍历二叉树。 二、非递归遍历二叉树的设计思想 非递归遍历二叉树是通过使用栈来模拟递归过程实现的。它的基本思想是:先将根节点入栈,然后循环执行以下操作:取出栈顶节点,访问该节点,将其右子树入栈,再将其左子树入栈。具体实现可以分为前序遍历、中序遍历和后序遍历三种。 1. 前序遍历 前序遍历的非递归实现思路是:先将根节点入栈,然后循环执行以下操作:取出栈顶节点,访问该节点,将其右子树入栈,再将其左子树入栈。具体实现代码如下: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); visit(node); if (node->right != NULL) { s.push(node->right); } if (node->left != NULL) { s.push(node->left); } } } ``` 2. 中序遍历 中序遍历的非递归实现思路是:先将根节点入栈,然后循环执行以下操作:如果当前节点为空,则将其入栈并将左子树作为当前节点;如果当前节点为空,则取出栈顶节点,访问该节点,将右子树作为当前节点。具体实现代码如下: ``` void inorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; TreeNode* node = root; while (!s.empty() || node != NULL) { if (node != NULL) { s.push(node); node = node->left; } else { TreeNode* tmp = s.top(); s.pop(); visit(tmp); node = tmp->right; } } } ``` 3. 后序遍历 后序遍历的非递归实现思路是:先将根节点入栈,然后循环执行以下操作:取出栈顶节点,如果该节点没有子节点,或者其子节点都已经访问过了,则访问该节点;否则将其右子节点和左子节点依次入栈。具体实现代码如下: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; TreeNode* last = NULL; while (!s.empty() || root != NULL) { if (root != NULL) { s.push(root); root = root->left; } else { TreeNode* node = s.top(); if (node->right != NULL && node->right != last) { root = node->right; } else { visit(node); last = node; s.pop(); } } } } ``` 非递归遍历二叉树的优点是可以避免递归过程中的函数调用栈,从而提高遍历效率。但是它也需要使用辅助栈来存储节点,增加了空间复杂度。此外,非递归遍历二叉树的实现过程比递归遍历二叉树更加复杂,需要考虑各种情况的处理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值