zoukankan      html  css  js  c++  java
  • 算法总结之 二叉树的非递归遍历

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

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

    实现非递归的先序遍历:

    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();
            
        }
        
        
        
    }

      

  • 相关阅读:
    CentOS6 配置阿里云 NTP 服务
    使用docker-compose运行nginx容器挂载时遇到的文件/目录问题
    Springboot配置文件参数使用docker-compose实现动态配置
    Dockerfile文件全面详解
    docker 生成mysql镜像启动时自动执行sql
    CentOS无法识别NTFS格式U盘完美解决方案
    网络模型与网络策略
    k8s更换网络插件:从flannel更换成calico
    数据采集实战(四)-- 线性代数习题答案下载
    leedcode 146. LRU 缓存机制(哈希+双向链表)
  • 原文地址:https://www.cnblogs.com/toov5/p/7508866.html
Copyright © 2011-2022 走看看