Java 利用栈进行非递归二叉树遍历

前序遍历

借助一个栈,先把根节点压入,当栈不为空是弹栈,依次判断节点有没有右孩子和左孩子,有就压入。因为前序遍历顺序是根左右,所以右孩子要比左孩子先压入栈中。
	public static void pre(TreeNode head) {
		if(head != null) {
			Stack<TreeNode> s = new Stack();
			s.push(head);
			while(!s.empty()) {
				head = s.pop();
				if(head.right != null)
					s.push(head.right);
				if(head.left != null)
					s.push(head.left);
			}
		}
	}

中序遍历

将左孩子依次入栈,没有了就弹栈,弹栈过程中如果有右孩子就压入栈中
public static void in(TreeNode head) {
		if(head != null) {
			Stack<TreeNode> s = new Stack();
			while(!s.empty() || head != null) {
				if(head != null) {
					s.push(head);
					head = head.left;
				}else {
					head = s.pop();
					head = head.right;
				}
			}
		}
	}

后序遍历

借助两个栈,第一个栈以左孩子右孩子的方式压栈,弹到第二个栈(第二个栈压栈)就是以右孩子左孩子的方式压栈,第二个栈再弹栈的时候就是以左孩子右孩子的方式弹栈了。思想有点像两个栈实现一个队列。
	public static void pos(TreeNode head) {
		if(head != null) {
			Stack<TreeNode> s1 = new Stack();
			Stack<TreeNode> s2 = new Stack();
			s1.push(head);
			while(!s1.empty()) {
				head = s1.pop();
				s2.push(head);
				if(head.left != null)
					s1.push(head.left);
				if(head.right != null)
					s1.push(head.right);
			}
			while(!s2.empty())
				s2.pop();
		}
	}

你可能感兴趣的:(Java 利用栈进行非递归二叉树遍历)