zoukankan      html  css  js  c++  java
  • Binary tree traverse

    package com.exuan.btreetraverse;

    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;

    public class BTreeTraverse {
        
        public static void main(String[] args)
        {
            
        }
        
    /*-------------------------------------------------------------
     * traverse the binary tree without using the recursion method
     * start
     */
        
        /* -----------------------------------------------------
         * start 'depth-first' traverse
         * we need to use a stack in the 'depth-first' traverse
         */
        
        //pre-order traverse
        private static void preOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            while(node != null || !s.empty())
            {
                while(node != null)
                {
                    visit(node);//visit the root
                    s.push(node);
                    node = node.left;//visit the left child
                }
                if(!s.empty())
                {
                    node = s.pop();
                    node = node.right;//visit the right child
                }
            }
        }
        
        //in-order traverse
        private static void inOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            while(node != null || !s.empty())
            {
                while(node != null)
                {
                    s.push(node);
                    node = node.left;//visit the left child
                }
                if(!s.empty())
                {
                    node = s.pop();
                    visit(node);//visit the root
                    node = node.right;//visit the right child
                }
            }
        }
        
        
        //post-order traverse
        private static void postOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            /*we need a temporary variable to store the previous visited node,
             * if we have visit the left child and the right child
             * then the pre must be the right child, new we can visit the root
             * */
            TreeNode pre = null;
            while(node != null || !s.empty())
            {
                if(node != null)
                {
                    s.push(node);
                    node = node.left;//visit the left child
                }
                else
                {
                    node = s.peek();
                    if(node.right != null && pre != node.right)
                    {
                        node = node.right;//visit the right child
                    }
                    else
                    {
                        /*the node doesn't have a right child or
                         * the right child has been visited(means the pre == node.right),
                         * now we can visit it
                         */
                        node = s.peek();
                        pre = s.peek();
                        visit(node);//visit the root
                        s.pop();
                        node = null;
                    }
                }
            }
        }
        
        /* end 'depth-first' traverse
         * -----------------------------------------------------
         */
        
        /* -----------------------------------------------------
         * start 'breadth-first' traverse
         * 'breadth-first' traverse is 'level order' traverse
         * we need to use a queue in the 'depth-first' traverse
         */
        
        private static void BFTraverse(TreeNode root)
        {
            Queue q = new LinkedList();
            TreeNode node = root;
            if(node != null)
            {
                q.add(node);
                while(!q.isEmpty())
                {
                    node = q.peek();
                    visit(node);
                    if(node.left != null)
                    {
                        q.add(node.left);
                    }
                    if(node.right != null)
                    {
                        q.add(node.right);
                    }
                    q.remove();
                }
            }
        }
        
        /* end 'breadth-first' traverse
         * -----------------------------------------------------
         */
        
    /*end
    * traverse the binary tree without using the recursion method
    * -------------------------------------------------------------
    */
        
    /*-------------------------------------------------------------
    * traverse the binary tree using the recursion method
    * start
    */
        
        //pre-order traverse
        private static void preOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            visit(node);
            preOrderTraverseR(node.left);
            preOrderTraverseR(node.right);
        }
        
        //in-order traverse
        private static void inOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            preOrderTraverseR(node.left);
            visit(node);
            preOrderTraverseR(node.right);
        }
        
        
        //post-order traverse
        private static void postOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            preOrderTraverseR(node.left);
            preOrderTraverseR(node.right);
            visit(node);
        }

    /*end
    * traverse the binary tree using the recursion method
    * -------------------------------------------------------------
    */    
        
        private static void visit(TreeNode node)
        {
            System.out.print(node.data + ",");
        }
        
    }

    class TreeNode
    {
        int data;
        TreeNode left;
        TreeNode right;
    }

  • 相关阅读:
    阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
    IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!
    长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践
    手把手教你实现网页端社交应用中的@人功能:技术原理、代码示例等
    跟着源码学IM(九):基于Netty实现一套分布式IM系统
    网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别
    探探的IM长连接技术实践:技术选型、架构设计、性能优化
    直播系统聊天技术(六):百万人在线的直播间实时聊天消息分发技术实践
    基于实践:一套百万消息量小规模IM系统技术要点总结
    Datafram 实现作为正文发送邮件
  • 原文地址:https://www.cnblogs.com/jayceli/p/2428613.html
Copyright © 2011-2022 走看看