以下是先序和中序,采用相似的模式:
/**
* 二叉树先序非递归遍历算法。
*
* @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;
}
}
}
}
非递归实现后序遍历方法(同自己的中序相似)
- /* 非递归实现后序遍历
- * 除了最左的一个左子结点,把所有的左子结点相继入栈(是一个循环过程)
- * 这时p指向最左的那个左子结点,
- * 重复:若p没有右子结点(或者p的右子结点已经输出),则输出p,同时出栈,将值赋给p
- * 若p有右子结点,则将p入栈,同时p指向其右子结点
- * 重复以上步骤,直到p为空
- */
- protected static void iterativePostorder(BTNode p){
- BTNode q = p;
- Stack<BTNode> stack = new Stack<BTNode>();
- while(p!=null){
- //所有的左子结点相继入栈,除了最后一个
- while(p.getLeft()!=null){
- stack.push(p);
- p = p.getLeft();
- }
- //当前节点无右子结点或右子结点已经输出
- while(p.getRight()==null||p.getRight()==q){
- visit(p);
- q = p;//记录上一个已输出节点
- if(stack.empty())
- return;
- p = stack.pop();
- }
- //处理右子结点
- stack.push(p);//如果上面的while循环没有执行,那么此处入栈的是最左的一个左子结点
- p = p.getRight();//这里p的右子结点必定不会为空
- }
- }