以下是先序和中序,采用相似的模式:
/**
* 二叉树先序非递归遍历算法。
*
* @param <T>
* 不同data类型
* @param t
* 二叉树的根节点
*/
public static <T> void preOrderUnrecur(Node<T> t) {
if (t == null)
return;
Stack<Node<T>> stack = new Stack<Node<T>>();
stack.push(t);
while (!stack.isEmpty()) {
while (stack.peek() != null) {
System.out.print(stack.peek());
stack.push(stack.peek().lchild);
}
Node<T> p = stack.pop();
if (!stack.isEmpty()) {
p = stack.pop();
stack.push(p.rchild);
}
}
}
/**
* 二叉树中序非递归遍历算法。
*
* @param <T>
* 不同data类型
* @param t
* 二叉树的根节点
*/
public static <T> void inOrderUnrecur(Node<T> t) {
if (t == null)
return;
Stack<Node<T>> stack = new Stack<Node<T>>();
stack.push(t);
while (!stack.isEmpty()) {
while (stack.peek() != null) {
stack.push(stack.peek().lchild);
}
Node<T> p = stack.pop();
if (!stack.isEmpty()) {
System.out.print(stack.peek());
p = stack.pop();
stack.push(p.rchild);
}
}
}
先序非递归遍历(最喜欢的一方方法):
public void loopPreOrder()
{
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p=root;
if(p!=null){
stack.push(p);
while(!stack.empty()){
p = stack.pop();
System.out.print(p);
//右子结点先进栈,左子结点再进栈,所以先访问的是左子结点
if(p.right!= null)
stack.push(p.right);
if(p.left!= null)
stack.push(p.left);
}
}
}
中序非递归遍历(我的):
public void loopInoder(){
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode t=root,cur;
while(t!=null)
{
stack.add(t);
t=t.left;
}
while(!stack.empty()){
t=stack.pop();
System.out.print(t.data+" ");
if(t.right!=null)
{
stack.add(t.right);
t=t.right;
while(t.left!=null)
{
stack.add(t.left);
t=t.left;
}
}
}
}
非递归实现后序遍历方法(同自己的中序相似)