编程题练习日记-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 
 


阅读更多

扫码向博主提问

飞火流云

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 图计算
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页