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

原创 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);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树遍历-前序中序(非递归)

前序遍历、中序遍历(非递归):需要借助一个栈结构 栈结构的头文件:构造一个栈结构,实现栈的基本功能函数入栈、出栈、栈顶元素、判断栈空等函数 二叉树的头文件不变(详情看上一篇层次递...

二叉树遍历 非递归 C++实现

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实...

【数据结构】Java实现二叉树遍历(非递归)

以二叉排序树来建立的一棵二叉树,然后用先序,中序,后序非递归遍历package DataStructure;import java.util.Stack; public class BinaryTr...

二叉树遍历(非递归)

package com.wzs; import java.util.Stack; /** * 二叉树遍历-非递归 * * @author Administrator * */ pub...

二叉树遍历(非递归版)

在数据量较小时,和递归版本的时间是差不多的,额因为还没有去看算法的那个计算时间复杂度和空间复杂度的东西,所以对那个不懂,只能用最直观的测试时间来判断速度文件"trees.h"#include usi...

16 - 12 - 23 二叉树遍历的非递归-栈实现

/二叉树遍历之章/

二叉树遍历(前序、中序、后序)递归与非递归

二叉树的非递归遍历                       ...

算法 二叉树遍历 递归和非递归

前言本篇文章介绍二叉树的几种遍历方法:前序遍历、中序遍历、后序遍历和层序遍历。 包含递归和非递归遍历。二叉树表示结点表示,构造二叉树public class BiNode { public ...

二叉树遍历-后序遍历(非递归)

后序非递归遍历,不和前序中序一块写,是因为,后序遍历稍微和前序中序遍历不一样,后序遍历的话必须要判断是右子树退回还是左子树退回,右子树退回直接访问,左子树退回不能直接访问 栈的头文件中:只是栈中元素稍...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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