二叉树遍历(递归和非递归)

原创 2013年12月03日 21:15:47
package Bean;

import java.util.Stack;

public class BinaryTree {

	int data;// 根节点树
	BinaryTree left;// 左节点
	BinaryTree right;// 右节点

	public BinaryTree(int data) {
		this.data = data;
		this.left = null;
		this.right = null;
	}

	public void insert(BinaryTree root, int data) {
		if (data > root.data) {
			if (root.right == null) {
				root.right = new BinaryTree(data);
			} else {
				this.insert(root.right, data);
			}
		} else {
			if (root.left == null) {
				root.left = new BinaryTree(data);
			} else {
				this.insert(root.left, data);
			}
		}
	}

	// 先序递归遍历
	public static void preOrder(BinaryTree root) {
		if (root == null)
			return;
		System.out.print(root.data + "---");
		if (root.left != null) {
			preOrder(root.left);
		}
		if (root.right != null) {
			preOrder(root.right);
		}
	}

	// 先序遍历非递归
	public static void preOrder2(BinaryTree root) {
		Stack<BinaryTree> s = new Stack<BinaryTree>();
		while (root != null || !s.empty()) {
			while (root != null) {
				System.out.print(root.data + "---");
				s.push(root);
				root = root.left;
			}
			if (!s.empty()) {
				root = s.pop();
				root = root.right;
			}
		}
	}

	// 中序递归遍历
	public static void InOrder(BinaryTree root) {
		if (root == null)
			return;
		if (root.left != null) {
			InOrder(root.left);
		}
		System.out.print(root.data + "---");
		if (root.right != null) {
			InOrder(root.right);
		}
	}

	// 中序非递归遍历
	public static void InOrder2(BinaryTree root) {
		Stack<BinaryTree> s = new Stack<BinaryTree>();
		while (root != null || s != null) {
			while (root != null) {
				s.push(root);
				root = root.left;
			}

			if (s != null) {
				root = s.pop();
				System.out.print(root.data + "---");
				root = root.right;
			}
		}
	}

	// 后序递归遍历
	public static void forOrder(BinaryTree root) {
		if (root == null)
			return;
		if (root.left != null) {
			forOrder(root.left);
		}
		if (root.right != null) {
			forOrder(root.right);
		}
		System.out.print(root.data + "---");
	}


	// 后序非递归遍历
	public void forOrder2(BinaryTree root) {
		int sign = 0;// 得当当前访问节点的次数
		Stack stack = new Stack();// 定义一个可以存放TreeNode和Integer的栈

		while (root != null || stack != null) {
			if (root != null) {// 找最深左子树

				stack.push(root);// 将当前节点压入堆栈
				stack.push(1);// 并标记当前访问节点的次数
				root = root.left;
			} else {// 找到最深左子树后
				while (!stack.isEmpty()) {

					sign = (Integer) stack.pop();// 出栈标记
					root = (BinaryTree) stack.pop();// 出栈节点
					if (sign == 1) {// 第一次访问节点
						stack.push(root);
						stack.push(2);
						root = root.right;// 将节点指向右子树并开始访问指向右子树的左子树
						break;
					} else if (sign == 2) {// 当第二次出栈时访问节点 
						System.out.print(root.data);
						root = null;
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		int[] arr = { 13, 4, 5, 65, 34, 56, 23 };
		BinaryTree root = new BinaryTree(arr[0]);
		for (int i = 1; i < arr.length; i++) {
			root.insert(root, arr[i]);
		}

		forOrder(root);
	}
}

二叉树的建立、三种(递归、非递归)遍历方法

二叉树定义: 1.有且仅有一个特定的称之为根root的结点 2.当n>1时,除根结点之外的其余结点分为两个互不相交的子集。他们称为二叉树的左子树和右子树。 二叉树的一种建立方法: 若对有n个结...
  • jiang111_111shan
  • jiang111_111shan
  • 2015年06月08日 21:42
  • 943

二叉树的递归和非递归方式的三种遍历

二叉树的三种遍历方式,前序遍历,中序遍历,后序遍历,中的前中后都是指的是根节点的访问顺序,这三种遍历方式的概念在这里就不多说了,太普遍了! 二叉树的建立 我们这里以前序遍历为例: 我们先定...
  • woshinannan741
  • woshinannan741
  • 2016年10月16日 13:18
  • 705

对于二叉树三种非递归遍历方式的理解

利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回);因此,基于其的二叉树遍历操作深刻的体现了其特性: 1.先入、后出,只...
  • sdulibh
  • sdulibh
  • 2016年01月24日 11:25
  • 1255

二叉树的四种遍历的递归和非递归的实现

二叉树的三种遍历为:前序遍历,中序遍历和后序遍历。 遍历的实现可分为递归和非递归。递归法与二叉树的定义相似,非递归法采用栈去模拟实现。 一、前序遍历的次序为:根结点——左结点——右结点。 递归法实现:...
  • xiaominkong123
  • xiaominkong123
  • 2016年06月02日 16:50
  • 407

史上最简明易懂非递归遍历二叉树算法

三种不同的遍历方式区别在于栈空间的释放时机和输出结点信息时机的不同:先序和中序遍历是在访问栈顶元素的右孩子(右子树)之前退栈,而后序遍历在访问右子树之后退栈;先序遍历是在某结点入栈时输出其信息,而中序...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2014年10月29日 14:59
  • 3670

【数据结构与算法】二叉树递归与非递归遍历(附完整源码)

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但...
  • mmc_maodun
  • mmc_maodun
  • 2013年10月24日 08:58
  • 40465

Java实现二叉树后序非递归遍历(好理解)

//不明白的大家可以一起讨论!欢迎留言! /** * public class Node { public int data; //树结点标号 public Node lchild; ...
  • zhuqiuhui
  • zhuqiuhui
  • 2016年05月04日 23:32
  • 2281

【C++】非递归遍历二叉树

//以下出现的_root标示二叉树的根节点 //非递归先序遍历(根节点->左节点->右节点)思想:即用栈实现 //遍历二叉树的前提条件是:该二叉树不为空。在满足该条件的情况下,进行以下步骤: //1...
  • ZDF0414
  • ZDF0414
  • 2015年11月19日 21:12
  • 448

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年07月06日 22:14
  • 64047

二叉树的非递归遍历(不用栈、O(1)空间)

本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: O(1)空间复杂度,即只能使用常数空间; 二叉树的形状不能被破坏(中间过程允许改变其形状)。 通常,实现二叉树的前序(preorder...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月09日 14:23
  • 2520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树遍历(递归和非递归)
举报原因:
原因补充:

(最多只允许输入30个字)