二叉树遍历的递归与非递归形式

那么根据递归的性质还是很好判断的.下面是递归访问节点的顺序:

显然,递归访问时,每次出现该节点的第一次就为先序遍历,

                                                             第二次就为中序遍历,

                                                             第三次就为后序遍历

  先序遍历:

   //preorder Traversal
    public static void preTraversal(Node head){
         if(head==null){
        	 return;
         }
         System.out.println(head.value);
         preTraversal(head.left);
         preTraversal(head.right);
    }

中序遍历:

//inorder Traversal
    public static void inTraversal(Node head){
    	if(head==null){
    		return;
    	} 
    	 inTraversal(head.left);
    	 System.out.println(head.value);
    	 inTraversal(head.right);
    }

后序遍历:

//postorder Traversal
    public static void postTraversal(Node head){
    	if(head==null){
    		return;
    	} 
    	 postTraversal(head.left);
    	 postTraversal(head.right);
    	 System.out.println(head.value);
    }

非递归形式:

 根据二叉树的访问可以知道:先中后访问顺序。

先序遍历的非递归形式为中左右. 因为栈出来的顺序与原来的顺序是相反的,起到了一个逆序的作用

 设计流程就先压右子树的节点入栈在压左子树的节点入栈(弹出栈的时候就是左右)

 //先序遍历
	    public static void preTraversal(Node head){
	         if(head!=null){  
	         Stack<Node> stk=new Stack<Node>();
	         stk.push(head);
	         while(!stk.isEmpty()){
	        	 System.out.println(stk.pop().value);
	        	 if(head.right!=null){
	        		 stk.push(head.right);
	        	 }
	        	 if(head.left!=null){
	        		 stk.push(head.left);
	        	 }
	             }
	         }
	    }
    //中序遍历
	    public static void inTraversal(Node head){
	         if(head!=null){
	        	Stack<Node> stk=new Stack<Node>();
	        	while(!stk.isEmpty() ||head!=null){
	        		if(head!=null){
	        			stk.push(head);
	        			head=head.left;
	        		}else{
	        			head=stk.pop();
	        			System.out.println(head.value);
	        			head=head.right;
	        		}
	        	}
	         }
	    }
	    

根据先序遍历的访问顺序可知:中左右,而后序遍历为左右中。那么其中的区别存在着逆序的关系(增加一个辅助栈).

其中的左右调整一下代码即可.

   //后序遍历
	    public static void postTraversal(Node head){
	         if(head!=null){
	             Stack<Node> stk=new Stack<Node>();
	             Stack<Node> help=new Stack<Node>();
	             stk.push(head);
	             while(!stk.isEmpty()){
	            	 head=stk.pop();
	            	 help.push(head);
	            	 if(head.left!=null){
	            		 stk.push(head.right);
	            	 }
	            	 if(head.right!=null){
	            		 stk.push(head.right);
	            	 }
	              }
	             for(int i=0;i<help.size();i++){
	            	 System.out.println(help.pop().value);
	             }  
	          }
	      }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值