二叉树中序遍历非递归-Java版
思路:
只用一个额外结点p。
构造一个栈,将根节点入栈。
每次循环做如下事情;
p来控制左孩子一直入栈,直到没有左孩子,这时p在最左边的结点。
这时如果p有右孩子,就将p指向p的右孩子,并将右孩子入栈。
如果没有的话p置空就行(不然的话,p还是在最左边的结点,下次循环会重新循环p)
import java.util.Stack; class TreeNode{ TreeNode left = null; TreeNode right = null; public int data = 0; TreeNode(int data){ this.data = data; } } public class InOrder { public static void main(String[] args){ TreeNode t1 = new TreeNode(1); TreeNode t2 = new TreeNode(2); TreeNode t3 = new TreeNode(3); TreeNode t4 = new TreeNode(4); TreeNode t5 = new TreeNode(5); TreeNode t6 = new TreeNode(6); t1.left = t2; t2.left = t3; t2.right = t4; t4.left = t5; t5.right = t6; inOrder(t1); } public static void inOrder(TreeNode root){ if(root == null){ return ; } Stack<TreeNode> s = new Stack<TreeNode>(); TreeNode p = root; s.add(p); //这里直接add(p) 不是root。 while( !s.empty()){ if(p != null && p.left != null){ s.add(p.left); //这里add的不是p而是p.left p = p.left; }else{ //else不能少,不然每次都弹出去一个元素 p = s.pop(); System.out.println(p.data); if(p.right != null){ s.add(p.right); p = p.right; }else{ p = null; //p已经被访问过了,置空,下次不访问。 } } } } }