zoukankan      html  css  js  c++  java
  • 二叉树的各种非递归遍历

    二叉树的结构:

    package com.ydp.tree.btree;
    public class BTreeNode {
    		public BTreeNode rchild = null;
    		public BTreeNode lchild = null;
    		public int	data;
    		
    		public boolean isFirst = true;//后序遍历使用,是否是首次入栈
    		
    		public BTreeNode(){}
    		public BTreeNode(int data){
    			this.data=data;
    		}
    	}
    

    二叉树的各种遍历:

    package com.ydp.tree.btree;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Queue;
    import java.util.Stack;
    import java.util.concurrent.ArrayBlockingQueue;
    
    public class BTree {
    
    	public static void main(String[] args) {
    		BTree tree = new BTree();
    		BTreeNode  root = new BTreeNode();	
    		ArrayList<Integer> list = new ArrayList<Integer>();
    		for(int i=1;i<=10;i++){
    			list.add(i);
    		}
    		tree.createTree(root,list);
    		System.out.println("层次遍历:");
    		tree.levelOrder(root);
    		System.out.println("
    先序遍历:");
    		tree.preOrder(root);
    		System.out.println("
    中序遍历:");
    		tree.midOrder(root);
    		System.out.println("
    后序遍历:");
    		tree.postOrder(root);
    	}	
    	
    	//创建二叉树
    	 void createTree(BTreeNode root,List<Integer> list){	
    		 BTreeNode  node = root;
    		 root.data=list.get(0);
    		 int index = 1;
    		 Queue<BTreeNode>  queue = new ArrayBlockingQueue<BTreeNode>(100);		 
    		 while(index < list.size() && node != null){
    			 node.lchild=new BTreeNode(list.get(index));
    			 queue.add(node.lchild);
    			 if(++index < list.size()){
    				 node.rchild=new BTreeNode(list.get(index));
    				 queue.add(node.rchild);
    			 }
    			 index++;
    			 node = queue.poll();
    		 }	
    	 }
    	//层次遍历
    	 void levelOrder(BTreeNode root){
    		 Queue<BTreeNode>  queue = new ArrayBlockingQueue<BTreeNode>(100);
    		 queue.add(root);
    		 BTreeNode node = null;
    		 while(queue.size()>0){
    			 node = queue.poll();
    			 System.out.print(node.data+" ");
    			 if(node.lchild != null){
    				 queue.add(node.lchild);
    			 }
    			 if(node.rchild != null){
    				 queue.add(node.rchild);
    			 }
    		 }		 
    	 }
    	 
    	 //先序遍历
    	 void preOrder(BTreeNode root){
    		 Stack<BTreeNode> stack = new Stack<BTreeNode>();
    		 BTreeNode node = root;			 
    		 while(node != null || !stack.empty()){
    			 while(node != null){
    				 System.out.print(node.data+" ");
    				 stack.push(node);
    				 node = node.lchild;
    			 }			 
    			 node = stack.pop();			
    			 node =  node.rchild;
    		 }	
    	 }
    	 
    	 //中序遍历
    	 void midOrder(BTreeNode root){
    		 Stack<BTreeNode> stack = new Stack<BTreeNode>();
    		 BTreeNode node = root;
    				 
    		 while(node != null || !stack.empty()){
    			 while(node != null){
    				 stack.push(node);
    				 node = node.lchild;
    			 }			 
    			 node = stack.pop();
    			 System.out.print(node.data+" ");
    			 node =  node.rchild;
    		 }		
    	 }
    	 
    	//后序遍历
    	 void postOrder(BTreeNode root){
    		 Stack<BTreeNode> stack = new Stack<BTreeNode>();
    		 BTreeNode node = root;
    		 
    		 while(node != null || !stack.empty() ){
    			 while(node != null && node.isFirst != false){
    				 stack.push(node);
    				 node = node.lchild;
    			 }
    			 node = stack.pop();
    			 if(node.isFirst == false || node.rchild == null ){
    				 System.out.print(node.data +" ");
    				 node = null;
    			 }else{
    				 node.isFirst =  false;
    				 stack.push(node);
    				 node = node.rchild;
    			 }
    		 }
    	 }
    	
    }
    

      

  • 相关阅读:
    此刻,很想那些老朋友
    985工程介绍
    211工程介绍
    蓝牙耳机声音断断续续
    不支持用淋浴洗澡
    在HY买饭
    成长路上的六个W
    屎、洗脚水
    Ubuntu更换软件源
    视频流媒体服务器RTMP和RTSP区别是什么?如何区分?
  • 原文地址:https://www.cnblogs.com/ydpup/p/5457848.html
Copyright © 2011-2022 走看看