首页 > 编程语言 > 详细

BFS、DFS、先序、中序、后序遍历的非递归算法(java)

时间:2016-01-27 19:01:20      阅读:292      评论:0      收藏:0      [点我收藏+]

一 广度优先遍历(BFS)

//广度优先遍历二叉树,借助队列,queue
    public static void bfs(TreeNode root){
        Queue<TreeNode> queue = new LinkedList<TreeNode>(); //队列需要使用linkedlist来初始化
        if(root == null)
            return;
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            System.out.print(node.val + " ");
            if(node.left != null)
                queue.add(node.left);
            if(node.right != null)
                queue.add(node.right);
        }
    }

二 深度优先遍历(DFS)

//深度优先遍历二叉树,借助堆栈,stack
    public static void dfs(TreeNode root){
        Stack<TreeNode> stack = new Stack<TreeNode>(); //借助stack
        if(root == null)
            return;
        stack.push(root);
        while(!stack.isEmpty()){ //若栈非空
            TreeNode node = stack.pop();
            System.out.print(node.val + " ");
            if(node.right != null) //先将右孩子结点压入堆栈
                stack.push(node.right);
            if(node.left != null) //然后将左孩子结点压入堆栈
                stack.push(node.left);
        }
    }

三、先序遍历非递归(preOrder)

/**
     * 迭代(即深度优先遍历二叉树)
     * 先序遍历二叉树
     * @param root
     * @return
     */
    public static List<Object> preorderTraversal(TreeNode root) {
        List<Object> list = new ArrayList<Object>();
        if(root == null)
            return list;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.add(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right != null) //先压入右子树
                stack.push(node.right);
            if(node.left != null) //再压入左子树
                stack.push(node.left);
        }
        System.out.println(list);
        return list;
    }

四、中序遍历非递归(inOrder)

/**
     * 迭代
     * 中序遍历二叉树
     * @param root
     * @return
     */
    public static List<Object> inorderTraversal(TreeNode root) {
          List<Object> list = new ArrayList<Object>();
          if(root == null)
              return  list;
          Stack<TreeNode> s = new Stack<TreeNode>();
          TreeNode p = root;
          while(p != null || !s.isEmpty()){
              while(p != null){
                  s.push(p);
                  p = p.left;
              }
              p = s.pop();
              list.add(p.val);
              p = p.right;
          }
          System.out.println(list);
          return list;
    }

五、后序遍历非递归(postOrder)

//后序非递归遍历二叉树
    public static List<Object> postOrder(TreeNode root){
        List<Object> list = new ArrayList<Object>();
        if(root == null)
            return list;
        Stack<TreeNode> stack = new Stack<TreeNode>();    
        TreeNode node = root, prev = root; //pre记录上一个已经输出的结点
        while (node != null || stack.size() > 0) {    
            while (node != null) {    
                stack.push(node);    
                node = node.left;    
            }    
            TreeNode temp = stack.peek().right; //在出栈之前,先判断栈顶元素的右孩子结点
            if (temp == null || temp == prev) { //当前节点无右子树或右子树已经输出    
                node = stack.pop();    
                list.add(node.val);
                prev = node; //记录上一个已输出结点
                node = null;    
            } else {    
                node = temp; //处理右子树
            }    
        }
        System.out.println(list);
        return list;
    }

 

BFS、DFS、先序、中序、后序遍历的非递归算法(java)

原文:http://www.cnblogs.com/mydesky2012/p/5163971.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!