二叉树~~~非递归便利~~~觉得写得赞的几个方法(自己+网上)

8 篇文章 0 订阅

以下是先序和中序,采用相似的模式:
 /**
  * 二叉树先序非递归遍历算法。
  * 
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void preOrderUnrecur(Node<T> t) {
  if (t == null)
   return;


  Stack<Node<T>> stack = new Stack<Node<T>>();


  stack.push(t);
  while (!stack.isEmpty()) {
   while (stack.peek() != null) {
    System.out.print(stack.peek());
    stack.push(stack.peek().lchild);
   }
   Node<T> p = stack.pop();


   if (!stack.isEmpty()) {
    p = stack.pop();
    stack.push(p.rchild);
   }
  }


 }


 /**
  * 二叉树中序非递归遍历算法。
  * 
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void inOrderUnrecur(Node<T> t) {
  if (t == null)
   return;


  Stack<Node<T>> stack = new Stack<Node<T>>();


  stack.push(t);
  while (!stack.isEmpty()) {
   while (stack.peek() != null) {
    stack.push(stack.peek().lchild);
   }
   Node<T> p = stack.pop();


   if (!stack.isEmpty()) {
    System.out.print(stack.peek());
    p = stack.pop();
    stack.push(p.rchild);
   }
  }


 }



先序非递归遍历(最喜欢的一方方法):

public void loopPreOrder()
{
Stack<TreeNode> stack = new Stack<TreeNode>();  
TreeNode p=root;
        if(p!=null){  
            stack.push(p);  
            while(!stack.empty()){  
                p = stack.pop();  
               System.out.print(p);  
                //右子结点先进栈,左子结点再进栈,所以先访问的是左子结点            
                if(p.right!= null)  
                    stack.push(p.right);  
                if(p.left!= null)  
                    stack.push(p.left);  
            }  
        }  

}


中序非递归遍历(我的):

public void loopInoder(){

Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode t=root,cur;
while(t!=null)
{
stack.add(t);
t=t.left;
}
while(!stack.empty()){
t=stack.pop();
System.out.print(t.data+" ");
if(t.right!=null)
{
stack.add(t.right);
t=t.right;
while(t.left!=null)
{
stack.add(t.left);
t=t.left;
}
}

}

}



非递归实现后序遍历方法(同自己的中序相似)

  1. /* 非递归实现后序遍历 
  2.      * 除了最左的一个左子结点,把所有的左子结点相继入栈(是一个循环过程) 
  3.      * 这时p指向最左的那个左子结点, 
  4.      * 重复:若p没有右子结点(或者p的右子结点已经输出),则输出p,同时出栈,将值赋给p 
  5.      * 若p有右子结点,则将p入栈,同时p指向其右子结点 
  6.      * 重复以上步骤,直到p为空 
  7.      */  
  8.     protected static void iterativePostorder(BTNode p){  
  9.         BTNode q = p;  
  10.         Stack<BTNode> stack = new Stack<BTNode>();  
  11.         while(p!=null){  
  12.             //所有的左子结点相继入栈,除了最后一个  
  13.             while(p.getLeft()!=null){  
  14.                 stack.push(p);  
  15.                 p = p.getLeft();  
  16.             }  
  17.             //当前节点无右子结点或右子结点已经输出  
  18.             while(p.getRight()==null||p.getRight()==q){  
  19.                 visit(p);  
  20.                 q = p;//记录上一个已输出节点  
  21.                 if(stack.empty())  
  22.                     return;  
  23.                 p = stack.pop();  
  24.             }  
  25.             //处理右子结点  
  26.             stack.push(p);//如果上面的while循环没有执行,那么此处入栈的是最左的一个左子结点  
  27.             p = p.getRight();//这里p的右子结点必定不会为空  
  28.         }  
  29.     }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值