编程题练习日记-2-二叉树遍历

前序中序后序,按层次。

这里递归的很好写就不写了,主要复习非递归的。

树:         4
         2     6  
       1  3   5  7 
              8
          10

非递归前序:

/**
    UnRecursive PreOrder, 非递归前序遍历
 **/
 PreOrder(BinaryTree<T> root) {
    Stack s = new Stack();
	Node n = root ;
	s.push(n) ;
	while(n!=null || !s.empty()) { 
		while(n!=null) {
		   println(n)
		   n = n->left 
		   s.push(n)
		}
		 
		if(!s.empty()) {
	 	   n = s.pop();
           s.push(n->right) ;			
		}
	}
 }
非递归前序遍历: 4   2   1   3   6   5   7   8   10 

首轮写的时候两个忘记的地方:

//非递归前序遍历没注意到的两个问题:
 1)n!=null || !s.empty() 应该是||,因为访问至最左下角1的时候,需要先将1的left进栈,发现空后pop1,
 然后push1的右孩子,其实还是空,然后进入下一个大循环,此时如果使用&&就跳出了,应该用||使得继续直接执行至pop1的父亲2,然后继续。
 2) if(!s.empty()) {  }  //注意这里栈pop前添加判断有助于防止空栈溢出。

 /**
    UnRecursive InOrder, 非递归中序遍历
  **/
  InOrder(BiNode T) {
     Stack s = new Stack() ;
while(T!=null||!s.empty()) {
   while(T!=null) {
  s.push(T->left) ;
  T = T->left ;
}

if(!s.empty()) {
  T = s.pop() ;
  println(T);
  T = T->right ;
}
}
  }
 
 
 非递归中序遍历:1 2 3 4 5 6 7 8 10 
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值