算法总结之 二叉树的非递归遍历

用递归解决的问题都能用非递归解决

这是因为无非就是利用函数栈来保存信息,如果自己申请的数据结构来代替栈,也可以实现相同功能。

实现非递归的先序遍历:

1 申请一个栈 stack  

2 然后将头节点head压入stack

3 从stack中弹出栈顶节点 cur, 打印cur的节点值。 再将cur的右孩子压入stack, 最后将cur的左孩子压入stack

重复 直到stack为空

package TT;

import java.util.Stack;

public class Test117 {
	public class Node{
		   public int value;
		   public Node left;
		   public Node right;
		   
		   public Node(int data){
			   this.value=data;
		   }
	   }
	
	public void  preOrderUnrecur(Node head){
		
		if(head !=null){
			
			Stack<Node> stack=new Stack<Node>();
			stack.add(head);
			while( !stack.isEmpty()){
			    head=stack.pop();
			    System.out.println(head.value+"");
			    if(head.right !=null){
			    	stack.push(head.right);
			    }
			    if(head.left != null){
			    	stack.push(head.left);
			    }
			}
	
		}	
		System.out.println();
	}

}

 非递归中序遍历

1 申请一个新的栈 stack  初始cur=head

2 把cur节点压入栈中 对以cur节点为头的整棵子树来说, 依次把左边界压入栈中,即不停的令 cur=cur.left  重复

3 不断重复步骤2 直到发现cur为null 此时从stack中弹出一个节点,记为node  打印node 的值  并且让cur=node.right  重复步骤2

4 当stack为null 且cur为null时, 整个过程停止

package TT;

import java.util.Stack;

public class Test118 {
    public class Node{
           public int value;
           public Node left;
           public Node right;
           
           public Node(int data){
               this.value=data;
           }
       }
    
public void inOrderUnRecur(Node head){
     
      if(head !=null){
          
          Stack<Node> stack = new Stack<Node>();
          while(!stack.isEmpty() || head!=null){
              
               if(head !=null){
                   stack.push(head);
                   head=head.left;
               }else {
                head=stack.pop();
                System.out.println(head.value+"");
                head=head.right;
            }
              
          }
          
          
          System.out.println();
      }
    
    
}    
    
}

非递归实现后序遍历   有两种方法 本博客介绍一种

两个栈实现后序遍历过程

1 申请两个栈 s1 s2   然后将头节点压入s1

2从s1中弹出的节点记为cur 然后将cur的左孩子和右孩子压入s1中

3 在整个过程中 每一个从s1弹出的节点都放进s2中

4不断重复2 和 3 直到s1为空 停止

从s2 中一次弹出节点并打印 打印的顺序就是后续遍历的顺序

package TT;

import java.util.Stack;

public class Test119 {

    public class Node{
           public int value;
           public Node left;
           public Node right;
           
           public Node(int data){
               this.value=data;
           }
       }
    
    public void posOrderUnRecur1(Node head){
        
        if(head !=null){
            Stack<Node> s1 = new Stack<Node>();
            Stack<Node> s2 = new Stack<Node>();
            s1.push(head);
            while(!s1.isEmpty()){
                head=s1.pop();
                s2.push(head);
                if(head.left != null){
                    s1.push(head.left);
                }
                if(head.right != null){
                    s1.push(head.right);
                }
            }
            while(!s2.isEmpty()){
                System.out.println(s2.pop().value+" ");
            }
        }
        
        System.out.println();
        
    }
    
    
    
}

 

  

 

posted @ 2017-09-12 10:41  toov5  阅读(288)  评论(0编辑  收藏  举报