【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里。

  • 图示

  • 代码实现

/**
 * 源代码名称:TreeIteratorNoRecursion.java
 * 日期:2014-08-23
 * 程序功能:二叉树深度遍历(非递归)
 * 版权:[email protected]
 * 作者:A2BGeek
 */
import java.util.Stack;

public class TreeIteratorNoRecursion {
	class TreeNode<T> {
		private T mNodeData;
		private TreeNode<T> mLeftChild;
		private TreeNode<T> mRightChild;

		public TreeNode(T data, TreeNode<T> left, TreeNode<T> right) {
			// TODO Auto-generated constructor stub
			mNodeData = data;
			mLeftChild = left;
			mRightChild = right;
		}

		public T getData() {
			return mNodeData;
		}

		public void setData(T data) {
			mNodeData = data;
		}

		public TreeNode<T> getLeft() {
			return mLeftChild;
		}

		public void setLeft(TreeNode<T> left) {
			mLeftChild = left;
		}

		public TreeNode<T> getRight() {
			return mRightChild;
		}

		public void setRight(TreeNode<T> right) {
			mRightChild = right;
		}
	}

	public TreeNode<String> createTree() {
		TreeNode<String> h = new TreeNode<String>("h", null, null);
		TreeNode<String> g = new TreeNode<String>("g", null, null);
		TreeNode<String> f = new TreeNode<String>("f", null, null);
		TreeNode<String> e = new TreeNode<String>("e", null, null);
		TreeNode<String> d = new TreeNode<String>("d", null, h);
		TreeNode<String> c = new TreeNode<String>("c", f, g);
		TreeNode<String> b = new TreeNode<String>("b", d, e);
		TreeNode<String> a = new TreeNode<String>("a", b, c);
		return a;
	}

	/*
	 * 1、有左儿子,入栈
	 * 2、无左儿子,自己出栈并看右儿子是否为空
	 * 3、右儿子为空,出栈
	 * 4、右儿子不为空,入栈
	 * 5、入栈时输出
	 */
	public void preIterate(TreeNode<String> root) {
		Stack<TreeNode<String>> stack = new Stack<TreeNode<String>>();
		TreeNode<String> now = root;
		do {
			while (now != null) {
				System.out.print(now.getData() + " ");
				stack.push(now);
				now = now.getLeft();
			}
			if (stack.size() == 0) {
				break;
			}
			now = stack.pop();
			now = now.getRight();
		} while (stack.size() >= 0);
	}

	/*
	 * 1、有左儿子,入栈
	 * 2、无左儿子,自己出栈并看右儿子是否为空
	 * 3、右儿子为空,出栈
	 * 4、右儿子不为空,入栈
	 * 5、出栈时输出
	 */
	public void midIterate(TreeNode<String> root) {
		Stack<TreeNode<String>> stack = new Stack<TreeNode<String>>();
		TreeNode<String> now = root;
		do {
			while (now != null) {
				stack.push(now);
				now = now.getLeft();
			}
			if (stack.size() == 0) {
				break;
			}
			now = stack.pop();
			System.out.print(now.getData() + " ");
			now = now.getRight();
		} while (stack.size() >= 0);
	}

	/*
	 * 1、有儿子,入栈
	 * 2、无儿子,输出自己
	 * 3、儿子被输出过,输出自己
	 */
	public void postIterate(TreeNode<String> root) {
		Stack<TreeNode<String>> stack = new Stack<TreeNode<String>>();
		TreeNode<String> now = root;
		TreeNode<String> pre = null;
		stack.push(now);
		while (stack.size() > 0) {
			now = stack.peek();
			if (now.getLeft() == null && now.getRight() == null || pre != null
					&& (now.getLeft() == pre || now.getRight() == pre)) {
				System.out.print(now.getData() + " ");
				pre = now;
				stack.pop();
			} else {
				if (now.getRight() != null) {
					stack.push(now.getRight());
				}
				if (now.getLeft() != null) {
					stack.push(now.getLeft());
				}
			}
		}
	}

	public static void main(String[] args) {
		TreeIteratorNoRecursion treeIteratorNoRecursion = new TreeIteratorNoRecursion();
		TreeNode<String> root = treeIteratorNoRecursion.createTree();
		treeIteratorNoRecursion.preIterate(root);
		System.out.println();
		treeIteratorNoRecursion.midIterate(root);
		System.out.println();
		treeIteratorNoRecursion.postIterate(root);
	}
}
时间: 2024-10-25 14:23:44

【数据结构与算法】二叉树深度遍历(非递归)的相关文章

【数据结构与算法】二叉树深度遍历(递归)

二叉树的深度遍历用递归的话就没有什么好说的了. 代码实现 /** * 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:[email protected] * 作者:A2BGeek */ public class TreeIteratorRecursion { class TreeNode<T> { private T mNodeData; private TreeNode<T> mLeftChi

二叉树的遍历(非递归)

1 //二叉树的先序遍历(非递归) 2 public void PreOrderTraverse() 3 { 4 BiTNode p = this.root; 5 Stack stack = new Stack(10000); 6 7 while(!stack.isEmpty || p != null) 8 if(p != null) 9 { 10 if(p.rchild != null) 11 stack.push(p.rchild); 12 System.out.print(p.data +

二叉树前序遍历非递归写法

前序遍历非递归依靠栈实现,相对来说比较简单,先来用手写模拟一下基本就能知道怎么写了 据此可得如下代码 void preOrder_stack(BiTree T){ printf("\n非递归先序遍历结果:\n"); initStack(&sqStack); BiTree p=T; push(&sqStack,p); while(!stackEmpty(sqStack)){ pop(&sqStack,&p); printf("%d ",

[数据结构与算法] 二叉树及其遍历方式

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289830.html 一.数据结构分类 (一)按逻辑结构 集合(无辑关系) 线性结构(线性表):数组.链表.栈.队列 非线性结构:树.图.多维数组 (二)按存储结构 顺序(数组)储结构.链式储结构.索引储结构.散列储结构 二.二叉树相关性质

二叉树的遍历--非递归实现

leetcode中有这么一道题,非递归来实现二叉树的遍历. 二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态.显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root. 方法1: 对于节点p可以分情况讨论 1. p如果是叶子节点,直接输出 2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈 3. p如果有孩子,而且孩子都已经访问过,则访问p节点 如何来表示出p的孩是否都已经访问过了

最容易理解的二叉树后续遍历非递归java实现

后续遍历要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈.如果P不存在左孩子和右孩子,则可以直接访问它:或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. java private static void postOrderNonRecursiveEasily(Node root) {

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

1 typedef struct TreeNode *BinTree; 2 typedef BinTree Position; 3 struct TreeNode{ 4 ElementType Data; 5 BinTree Left; 6 BinTree Right; 7 }; 8 BinTree BT; 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现) 10 { 11 BinTree T=BT; 12 Stack S=C

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

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归