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

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

  • 图示


  • 代码实现

/**
 * 源代码名称:TreeIteratorNoRecursion.java 
 * 日期:2014-08-23 
 * 程序功能:二叉树深度遍历(非递归) 
 * 版权:CopyRight@A2BGeek 
 * 作者: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);
	}
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。